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> 38fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <stdio.h> 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <math.h> 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <va/va_backend.h> 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drv_video.h" 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_output.h" 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_overlay.h" 45c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 462befccec034c13d34746a9e87149889d59ac767bFei Jiang 472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#ifdef ANDROID 4854752e65b02b1a84c491e3f9c964046faeea306eKun Wang#define psb_xrandr_single_mode() 0 49bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#else 50bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangint psb_xrandr_single_mode(); 512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif 522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData 542befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) 552befccec034c13d34746a9e87149889d59ac767bFei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 56cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan//#define GET_SURFACE_INFO_rotate(psb_surface) ((int) (psb_surface)->extra_info[5]) 572befccec034c13d34746a9e87149889d59ac767bFei Jiang 582befccec034c13d34746a9e87149889d59ac767bFei Jiang#ifndef VA_FOURCC_I420 592befccec034c13d34746a9e87149889d59ac767bFei Jiang#define VA_FOURCC_I420 0x30323449 602befccec034c13d34746a9e87149889d59ac767bFei Jiang#endif 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/********************************************************************************************** 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * I830ResetVideo 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Description: Use this function to reset the overlay register back buffer to its default 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * values. Note that this function does not actually apply these values. To do so, please 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * write to OVADD. 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang **********************************************************************************************/ 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoI830ResetVideo(VADriverContextP ctx, PsbPortPrivPtr pPriv) 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(overlayA, 0, sizeof(*overlayA)); 772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(overlayC, 0, sizeof(*overlayC)); 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCLRC1 = pPriv->saturation.Value; 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCLRC1 = pPriv->saturation.Value; 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DCLRK 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* case bit depth 16 */ 874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayA->DCLRKV = pPriv->colorKey; 882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM |= DEST_KEY_ENABLE; 892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM &= ~CONST_ALPHA_ENABLE; 90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayC->DCLRKV = pPriv->colorKey; 922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM |= DEST_KEY_ENABLE; 932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM &= ~CONST_ALPHA_ENABLE; 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM &= ~DEST_KEY_ENABLE; 962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM &= ~DEST_KEY_ENABLE; 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 982f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DWINSZ = 0x00000000; 992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCONFIG = CC_OUT_8BIT; 1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DWINSZ = 0x00000000; 1022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCONFIG = CC_OUT_8BIT; 1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic uint32_t I830BoundGammaElt(uint32_t elt, uint32_t eltPrev) 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt &= 0xff; 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang eltPrev &= 0xff; 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (elt < eltPrev) 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt = eltPrev; 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if ((elt - eltPrev) > 0x7e) 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt = eltPrev + 0x7e; 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return elt; 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic uint32_t I830BoundGamma(uint32_t gamma, uint32_t gammaPrev) 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return (I830BoundGammaElt(gamma >> 24, gammaPrev >> 24) << 24 | 119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun I830BoundGammaElt(gamma >> 16, gammaPrev >> 16) << 16 | 120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun I830BoundGammaElt(gamma >> 8, gammaPrev >> 8) << 8 | 121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun I830BoundGammaElt(gamma , gammaPrev)); 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangI830UpdateGamma(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 127b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 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)); 155b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 158437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void I830StopVideo(VADriverContextP ctx) 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 160b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1622befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 1633f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang I830OverlayRegPtr overlayA, overlayC; 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1663f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang if (!pPriv->overlayA_enabled && !pPriv->overlayC_enabled) { 167c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "I830StopVideo : no overlay has been enabled, do nothing.\n"); 1683f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return; 1693f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 1703f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 1713f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 1723f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGION_EMPTY(pScrn->pScreen, &pPriv->clip); 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->subpicture_enabled) { 1782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.subpicture_disable_mask = pPriv->subpicture_enable_mask; 179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->subpicture_enabled = 0; 180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(®s, 0, sizeof(regs)); 1842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->is_mfld && psb_xrandr_single_mode() == 0) { 1862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayC_enabled) { 1874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = OVC_REGRWBITS_OVADD; 188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 19054752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayC->DWINSZ = 0x00000000; 1914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayC->OCMD &= ~OVERLAY_ENABLE; 1924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = 0; 1932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OVC_REGRWBITS_OVADD; 19462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.b_wait_vblank = 1; 195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(®s, 0, sizeof(regs)); 1984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayC_enabled = 0; 1992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 2002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayA_enabled) { 201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun regs.overlay_read_mask = OV_REGRWBITS_OVADD; 202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 20454752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayA->DWINSZ = 0x00000000; 2054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlayA->OCMD &= ~OVERLAY_ENABLE; 2064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = 0; 2074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_write_mask = OV_REGRWBITS_OVADD; 20862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.b_wait_vblank = 1; 209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 2104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayA_enabled = 0; 2112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 2122f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } else { 21354752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.overlay_read_mask = OV_REGRWBITS_OVADD; 21454752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 21554752e65b02b1a84c491e3f9c964046faeea306eKun Wang 21654752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayA->DWINSZ = 0x00000000; 21754752e65b02b1a84c491e3f9c964046faeea306eKun Wang overlayA->OCMD &= ~OVERLAY_ENABLE; 21854752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.overlay_read_mask = 0; 2192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 22062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.b_wait_vblank = 1; 2212f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 22254752e65b02b1a84c491e3f9c964046faeea306eKun Wang pPriv->overlayA_enabled = 0; 2232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 224b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 227ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#if 0 2284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void I830SwitchPipe(VADriverContextP ctx , int overlayId, int pipeId) 2294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 2304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 2314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 2324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830OverlayRegPtr overlay = (I830OverlayRegPtr)(pPriv->regmap[overlayId]); 2334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo struct drm_psb_register_rw_arg regs; 2344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t overlay_mask; 235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((overlayId == OVERLAY_A) && pPriv->overlayA_enabled) 2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay_mask = OV_REGRWBITS_OVADD; 2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else if ((overlayId == OVERLAY_C) && pPriv->overlayC_enabled) 2394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay_mask = OVC_REGRWBITS_OVADD; 2404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 2414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return; /*No overlay enabled, do nothing.*/ 2424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 243c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Overlay %d switch to pipe %d\n", overlayId, pipeId); 2444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(®s, 0, sizeof(regs)); 2454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(overlay, 0, sizeof(*overlay)); 2464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 2474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCLRC1 = pPriv->saturation.Value; 2484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* case bit depth 16 */ 2504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DCLRKV = pPriv->colorKey; 2514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DCLRKM |= DEST_KEY_ENABLE; 252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->DCLRKM &= ~CONST_ALPHA_ENABLE; 2534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DWINSZ = 0x00000000; 2544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCONFIG = CC_OUT_8BIT; 2554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = overlay_mask; 2574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 2584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (pipeId) { 2604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case PIPEA: 261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_A; 2624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case PIPEB: 264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_B; 2654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case PIPEC: 2674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->OCONFIG |= OVERLAY_C_PIPE_C; 2684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 2704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_read_mask = 0; 2714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay_write_mask = overlay_mask; 2724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.overlay.b_wait_vblank = 1; 2734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 2744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 275ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#endif 2764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuni830_swidth(unsigned int offset, unsigned int width, unsigned int mask, int shift) 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int swidth = ((offset + width + mask) >> shift) - (offset >> shift); 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 1; 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth -= 1; 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return swidth << 2; 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic Bool 2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangSetCoeffRegs(double *coeff, int mantSize, coeffPtr pCoeff, int pos) 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int maxVal, icoeff, res; 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int sign; 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double c; 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sign = 0; 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang maxVal = 1 << mantSize; 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang c = *coeff; 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (c < 0.0) { 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sign = 1; 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang c = -c; 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang res = 12 - mantSize; 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) { 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 3; 3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(4 * maxVal); 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) { 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 2; 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(2 * maxVal); 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) { 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 1; 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(maxVal); 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) { 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 0; 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(maxVal / 2); 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Coeff out of range */ 3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return FALSE; 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].sign = sign; 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sign) 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = -(*coeff); 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return TRUE; 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangUpdateCoeff(int taps, double fCutoff, Bool isHoriz, Bool isY, coeffPtr pCoeff) 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i, j, j1, num, pos, mantSize; 3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double pi = 3.1415926535, val, sinc, window, sum; 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS]; 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double diff; 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int tapAdjust[MAX_TAPS], tap2Fix; 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool isVertAndUV; 3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (isHoriz) 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mantSize = 7; 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mantSize = 6; 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang isVertAndUV = !isHoriz && !isY; 3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang num = taps * 16; 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < num * 2; i++) { 3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num); 3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val == 0.0) 3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sinc = 1.0; 3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sinc = sin(val) / val; 3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Hamming window */ 3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang window = (0.5 - 0.5 * cos(i * pi / num)); 3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rawCoeff[i] = sinc * window; 3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Normalise the coefficients. */ 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i + j * 32; 3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += rawCoeff[pos]; 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i + j * 32; 3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffs[i][j] = rawCoeff[pos] / sum; 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Set the register values. */ 3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = j + i * taps; 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((j == (taps - 1) / 2) && !isVertAndUV) 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos); 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos); 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[0] = (taps - 1) / 2; 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) { 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[j1] = tapAdjust[0] - j; 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[++j1] = tapAdjust[0] + j; 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Adjust the coefficients. */ 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += coeffs[i][j]; 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sum != 1.0) { 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j1 = 0; j1 < taps; j1++) { 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tap2Fix = tapAdjust[j1]; 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang diff = 1.0 - sum; 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffs[i][tap2Fix] += diff; 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = tap2Fix + i * taps; 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV) 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos); 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos); 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += coeffs[i][j]; 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sum == 1.0) 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 411437b3eda28a4bf098efa80598cab67f190275266Fei Jiangi830_display_video( 412cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VADriverContextP ctx, PsbPortPrivPtr pPriv, VASurfaceID __maybe_unused surface, 413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int id, short width, short height, 414cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int dstPitch, int srcPitch, int __maybe_unused x1, int __maybe_unused y1, int __maybe_unused x2, int __maybe_unused y2, BoxPtr dstBox, 415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun short src_w, short src_h, short drw_w, short drw_h, 4162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int flags, int overlayId, int pipeId) 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 418b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int swidth, swidthy, swidthuv; 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int mask, shift, offsety, offsetu; 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int tmp; 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t OCMD; 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool scaleChanged = FALSE; 4252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int offset = wsbmBOOffsetHint(pPriv->wsbo[overlayId]) & 0x0FFFFFFF; 4262f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlay = (I830OverlayRegPtr)(pPriv->regmap[overlayId]); 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 428f91c8768670386683a281cc39141e21bdda9c97fKun Wang int i32EnableIEP = 0; 429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i32EnableIEPBLE = 0; 4305b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 4315b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang /*before enabling overlay, make sure overlay is disabled first.*/ 4325b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang if ((overlayId == OVERLAY_A) && !pPriv->overlayA_enabled) { 4335b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang memset(®s, 0, sizeof(regs)); 4345b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang regs.overlay_read_mask = OV_REGRWBITS_OVADD; 4355b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 4365b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 4375b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang overlay->OCMD &= ~OVERLAY_ENABLE; 4385b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang regs.overlay_read_mask = 0; 4395b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 4405b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 4415b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang } 4425b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* FIXME: don't know who and why add this 444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * comment it for full screen scale issue 445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * any concern contact qiang.miao@intel.com 446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0 448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (drw_w >= 800) { 449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x2 = x2 / 4; 450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun y2 = y2 / 4; 451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = dstBox->x2 / 4; 452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = dstBox->y2 / 4; 453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = drw_w / 4; 454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = drw_h / 4; 455437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 457751400dde1eac64dd41c7de33fcddf8a939e4ab2hding 458751400dde1eac64dd41c7de33fcddf8a939e4ab2hding#if USE_DCLRK 459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->DCLRKM &= ~CONST_ALPHA_ENABLE; 4602f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->subpicture_enabled) 4612f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->DCLRKM &= ~DEST_KEY_ENABLE; 4622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang else 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->DCLRKM |= DEST_KEY_ENABLE; 4644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo overlay->DCLRKV = pPriv->colorKey; 465751400dde1eac64dd41c7de33fcddf8a939e4ab2hding overlay->DCLRKM |= 0xffffff; 466751400dde1eac64dd41c7de33fcddf8a939e4ab2hding#else 467751400dde1eac64dd41c7de33fcddf8a939e4ab2hding /* disable overlay destination color key didn't work, 468751400dde1eac64dd41c7de33fcddf8a939e4ab2hding * it seems z-order of overlay has been bellow display pipe. 469751400dde1eac64dd41c7de33fcddf8a939e4ab2hding */ 470751400dde1eac64dd41c7de33fcddf8a939e4ab2hding overlay->DCLRKM &= ~DEST_KEY_ENABLE; 471751400dde1eac64dd41c7de33fcddf8a939e4ab2hding#endif 472751400dde1eac64dd41c7de33fcddf8a939e4ab2hding 4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_ROTATION_FUNC 474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((pipeId == PIPEA) && (driver_data->mipi0_rotation != VA_ROTATION_NONE)) || 4753f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ((pipeId == PIPEB) && (driver_data->hdmi_rotation != VA_ROTATION_NONE))) { 476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (pPriv->rotation) { 477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_NONE: 478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_270: 480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = dstBox->y1; 482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = pPriv->height_save - tmp; 483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x2; 484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = dstBox->y2; 485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = pPriv->height_save - tmp; 486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->y1; 487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = dstBox->y2; 488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = tmp; 489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = drw_w; 490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = drw_h; 491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = tmp; 492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_180: 494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = pPriv->width_save - dstBox->x2; 496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = pPriv->width_save - tmp; 497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->y1; 498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = pPriv->height_save - dstBox->y2; 499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = pPriv->height_save - tmp; 500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_ROTATION_90: 502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = pPriv->width_save - dstBox->y1; 504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y1 = tmp; 505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x2; 506dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = pPriv->width_save - dstBox->y2; 507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->y2 = tmp; 508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = dstBox->x1; 509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x1 = dstBox->x2; 510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dstBox->x2 = tmp; 511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = drw_w; 512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = drw_h; 513dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = tmp; 514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->oneLineMode) { 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* change the coordinates with panel fitting active */ 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y1 = (((dstBox->y1 - 1) * pPriv->scaleRatio) >> 16) + 1; 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y2 = ((dstBox->y2 * pPriv->scaleRatio) >> 16) + 1; 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now, alter the height, so we scale to the correct size */ 5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h = ((drw_h * pPriv->scaleRatio) >> 16) + 1; 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang shift = 6; 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mask = 0x3f; 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->curBuf == 0) { 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsety = pPriv->YBuf0offset; 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsetu = pPriv->UBuf0offset; 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsety = pPriv->YBuf1offset; 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsetu = pPriv->UBuf1offset; 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (id) { 540affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->SWIDTH = width | ((width / 2 & 0x7ff) << 16); 542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthy = i830_swidth(offsety, width, mask, shift); 543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthuv = i830_swidth(offsetu, width / 2, mask, shift); 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = (swidthy) | (swidthuv << 16); 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height | ((height / 2) << 16); 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 547affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 548affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->SWIDTH = width | ((width / 2 & 0x7ff) << 16); 550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthy = i830_swidth(offsety, width, mask, shift); 551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun swidthuv = i830_swidth(offsetu, width / 2, mask, shift); 5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = (swidthy) | (swidthuv << 16); 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height | ((height / 2) << 16); 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 555affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 556affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTH = width; 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth = ((offsety + (width << 1) + mask) >> shift) - 560dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (offsety >> shift); 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 1; 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth -= 1; 5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 2; 5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = swidth; 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height; 5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->DWINPOS = (dstBox->y1 << 16) | dstBox->x1; 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->DWINSZ = (((dstBox->y2 - dstBox->y1) << 16) | 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (dstBox->x2 - dstBox->x1)); 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* buffer locations */ 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0Y = pPriv->YBuf0offset; 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0U = pPriv->UBuf0offset; 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0V = pPriv->VBuf0offset; 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1Y = pPriv->YBuf1offset; 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1U = pPriv->UBuf1offset; 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1V = pPriv->VBuf1offset; 5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Calculate horizontal and vertical scaling factors and polyphase 5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * coefficients. 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 589437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (1) { 5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int xscaleIntUV, xscaleFractUV; 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int yscaleIntUV, yscaleFractUV; 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* UV is half the size of Y -- YUV420 */ 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int uvratio = 2; 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t newval; 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i, j, pos; 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int deinterlace_factor; 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Y down-scale factor as a multiple of 4096. 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((id == VA_FOURCC_NV12) && (0 != (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD)))) 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deinterlace_factor = 2; 6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deinterlace_factor = 1; 6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* deinterlace requires twice of VSCALE setting*/ 610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (src_w == drw_w && src_h == drw_h) { 611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun xscaleFract = 1 << 12; 612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun yscaleFract = (1 << 12) / deinterlace_factor; 613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFract = ((src_w - 1) << 12) / drw_w; 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFract = ((src_h - 1) << 12) / (deinterlace_factor * drw_h); 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Calculate the UV scaling factor. */ 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFractUV = xscaleFract / uvratio; 6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFractUV = yscaleFract / uvratio; 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * To keep the relative Y and UV ratios exact, round the Y scales 6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * to a multiple of the Y/UV ratio. 6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFract = xscaleFractUV * uvratio; 6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFract = yscaleFractUV * uvratio; 6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Integer (un-multiplied) values. */ 6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleInt = xscaleFract >> 12; 6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleInt = yscaleFract >> 12; 6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleIntUV = xscaleFractUV >> 12; 6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleIntUV = yscaleFractUV >> 12; 6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* shouldn't get here */ 6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (xscaleInt > 7) { 6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 6397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* shouldn't get here */ 6427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (xscaleIntUV > 7) { 6437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 6447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) 647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleInt << 15) | 648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 649437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleInt << 16) | 651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->YRGBSCALE) { 6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->YRGBSCALE = newval; 6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) 659437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((yscaleFractUV & 0xFFF) << 20); 661437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleIntUV << 16) | ((xscaleFractUV & 0xFFF) << 3) | 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ((yscaleFractUV & 0xFFF) << 20); 664437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->UVSCALE) { 6667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UVSCALE = newval; 6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang newval = yscaleInt << 16 | yscaleIntUV; 6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->UVSCALEV) { 6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UVSCALEV = newval; 6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Recalculate coefficients if the scaling changed. */ 6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Only Horizontal coefficients so far. 6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (scaleChanged) { 6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double fCutoffY; 6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double fCutoffUV; 6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = xscaleFract / 4096.0; 6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = xscaleFractUV / 4096.0; 6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Limit to between 1.0 and 3.0. */ 6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffY < MIN_CUTOFF_FREQ) 6907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = MIN_CUTOFF_FREQ; 6917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffY > MAX_CUTOFF_FREQ) 6927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = MAX_CUTOFF_FREQ; 6937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffUV < MIN_CUTOFF_FREQ) 6947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = MIN_CUTOFF_FREQ; 6957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffUV > MAX_CUTOFF_FREQ) 6967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = MAX_CUTOFF_FREQ; 6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UpdateCoeff(N_HORIZ_Y_TAPS, fCutoffY, TRUE, TRUE, xcoeffY); 6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UpdateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, TRUE, FALSE, xcoeffUV); 7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i * N_HORIZ_Y_TAPS + j; 7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->Y_HCOEFS[pos] = (xcoeffY[pos].sign << 15 | 7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffY[pos].exponent << 12 | 7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffY[pos].mantissa); 7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i * N_HORIZ_UV_TAPS + j; 7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UV_HCOEFS[pos] = (xcoeffUV[pos].sign << 15 | 7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffUV[pos].exponent << 12 | 7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffUV[pos].mantissa); 7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD = OVERLAY_ENABLE; 7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (id) { 723affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = dstPitch | (dstPitch << 16); 7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= NV12;//in the spec, there are two NV12, which to use? 7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 729affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 730affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* set UV vertical phase to -0.25 */ 732437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* overlay->UV_VPH = 0x30003000; */ 7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = (dstPitch * 2) | (dstPitch << 16); 7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= YUV_420; 7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 738affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 739affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = dstPitch; 7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= YUV_422; 7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 744affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang if (id == VA_FOURCC_UYVY) 7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= Y_SWAP; 7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD)) { 750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD |= BUF_TYPE_FIELD; 751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD &= ~FIELD_SELECT; 752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (flags & VA_BOTTOM_FIELD) { 754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD |= FIELD1; 755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_0Y = pPriv->YBuf0offset - srcPitch; 756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_0U = pPriv->UBuf0offset - srcPitch; 757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_0V = pPriv->VBuf0offset - srcPitch; 758dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_1Y = pPriv->YBuf1offset - srcPitch; 759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_1U = pPriv->UBuf1offset - srcPitch; 760dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OBUF_1V = pPriv->VBuf1offset - srcPitch; 761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 762dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD |= FIELD0; 763437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else { 764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD &= ~(FIELD_SELECT); 765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun OCMD &= ~BUF_TYPE_FIELD; 7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~(BUFFER_SELECT); 7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->curBuf == 0) 7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= BUFFER0; 7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= BUFFER1; 7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OCMD = OCMD; 7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (overlayId) { 7792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case OVERLAY_A: 7802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 1; 7812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 7822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 7832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case OVERLAY_C: 7842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayC_enabled = 1; 7852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OVC_REGRWBITS_OVADD; 7862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 7872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 7882befccec034c13d34746a9e87149889d59ac767bFei Jiang 789dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) { 79062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang i32EnableIEP = 0; 791dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 79262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang i32EnableIEPBLE = 0; 7932befccec034c13d34746a9e87149889d59ac767bFei Jiang 7942befccec034c13d34746a9e87149889d59ac767bFei Jiang if (i32EnableIEP == 0) { 7952befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG = CC_OUT_8BIT; 7962befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG &= OVERLAY_C_PIPE_A | (~OVERLAY_C_PIPE_MASK); 7972befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG |= IEP_LITE_BYPASS; 7982befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.OVADD = offset | 1; 7992befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.IEP_ENABLED = 0; 80062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang regs.overlay.buffer_handle = wsbmKBufHandle(wsbmKBuf(pPriv->wsbo[overlayId])); 801877c87ab252f7f62441423a29cdd1cbce8dd532fAustin Yuan } 802dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 803643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang overlay->OCONFIG = CC_OUT_8BIT; 804643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang overlay->OCONFIG |= IEP_LITE_BYPASS; 805643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang regs.overlay.OVADD = offset | 1; 806643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 8072befccec034c13d34746a9e87149889d59ac767bFei Jiang 808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) { 809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (pipeId) { 8102f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case PIPEA: 811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_A; 812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= ZORDER_TOP; 8132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case PIPEB: 815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= OVERLAY_C_PIPE_B; 8162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 8172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD |= 0x80; 8182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case PIPEC: 8202f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= OVERLAY_C_PIPE_C; 821dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay->OCONFIG |= ZORDER_TOP; 8222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD |= 0x40; 8232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 8242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 8252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 826dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 8272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= pipeId << 18; /* mrst */ 8282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8299e01d13ef1fc6ecfcabcedb7269ed28a098f730dmahongpe if (IS_CTP(driver_data) || IS_MRFL(driver_data) ) 83060acc53b7127b8fbaec5cc53d695268c13659092Ma, Hongpeng regs.overlay.b_wms = 1; 83160acc53b7127b8fbaec5cc53d695268c13659092Ma, Hongpeng 8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 8332befccec034c13d34746a9e87149889d59ac767bFei Jiang 834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->is_mfld) { 835dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (regs.overlay.IEP_ENABLED) { 836dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0 837dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun printf("regs.overlay BLE minmax 0x%x, BSSCC control 0x%x\n", 838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun regs.overlay.IEP_BLE_MINMAX, regs.overlay.IEP_BSSCC_CONTROL); 839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *(unsigned int *)((unsigned int)&(overlay->IEP_SPACE[0]) + 0x804) = regs.overlay.IEP_BLE_MINMAX; 8412befccec034c13d34746a9e87149889d59ac767bFei Jiang } 8422befccec034c13d34746a9e87149889d59ac767bFei Jiang } 843b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8460da1930627209986e8db220799a690f816494401Austin Yuan 8470da1930627209986e8db220799a690f816494401Austin Yuanstatic void I830PutImageFlipRotateSurface( 8480da1930627209986e8db220799a690f816494401Austin Yuan VADriverContextP ctx, 8495b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang object_surface_p obj_surface, 8500da1930627209986e8db220799a690f816494401Austin Yuan int *src_w_new, int *src_h_new, 8510da1930627209986e8db220799a690f816494401Austin Yuan int *width_new, int *height_new, 8520da1930627209986e8db220799a690f816494401Austin Yuan psb_surface_p *psb_surface_new, 8530da1930627209986e8db220799a690f816494401Austin Yuan int pipeId) 8540da1930627209986e8db220799a690f816494401Austin Yuan{ 8550da1930627209986e8db220799a690f816494401Austin Yuan int src_w = *src_w_new, src_h = *src_h_new; 8560da1930627209986e8db220799a690f816494401Austin Yuan int width = *width_new, height = *height_new; 8570da1930627209986e8db220799a690f816494401Austin Yuan int tmp = 0; 8585b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 8590da1930627209986e8db220799a690f816494401Austin Yuan psb_surface_p psb_surface = NULL; 8600da1930627209986e8db220799a690f816494401Austin Yuan INIT_DRIVER_DATA; 8610da1930627209986e8db220799a690f816494401Austin Yuan PsbPortPrivPtr pPriv; 8620da1930627209986e8db220799a690f816494401Austin Yuan 8634338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang /* local/extend display doesn't have render rotation */ 86462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang if (((pipeId == PIPEA) && (driver_data->local_rotation == VA_ROTATION_NONE)) || 8653f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ((pipeId == PIPEB) && (driver_data->extend_rotation == VA_ROTATION_NONE))) 8660da1930627209986e8db220799a690f816494401Austin Yuan return; 8670da1930627209986e8db220799a690f816494401Austin Yuan 8680da1930627209986e8db220799a690f816494401Austin Yuan pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 8695b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 8700da1930627209986e8db220799a690f816494401Austin Yuan if (pipeId == PIPEA) { 8710da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->local_rotation != VA_ROTATION_NONE) { 8724d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng psb_surface = obj_surface->out_loop_surface; 8730da1930627209986e8db220799a690f816494401Austin Yuan width = obj_surface->width_r; 8740da1930627209986e8db220799a690f816494401Austin Yuan height = obj_surface->height_r; 8750da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->local_rotation != VA_ROTATION_180) { 8760da1930627209986e8db220799a690f816494401Austin Yuan tmp = src_w; 8770da1930627209986e8db220799a690f816494401Austin Yuan src_w = src_h; 8780da1930627209986e8db220799a690f816494401Austin Yuan src_h = tmp; 8790da1930627209986e8db220799a690f816494401Austin Yuan } 8800da1930627209986e8db220799a690f816494401Austin Yuan } 881f91c8768670386683a281cc39141e21bdda9c97fKun Wang if ((driver_data->local_rotation == VA_ROTATION_NONE) || 8823f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang (driver_data->local_rotation == VA_ROTATION_180)) { 8830da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->display_width; 8840da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->display_height; 8850da1930627209986e8db220799a690f816494401Austin Yuan } else { 8860da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->display_height; 8870da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->display_width; 8880da1930627209986e8db220799a690f816494401Austin Yuan } 889f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->is_android == 0) 890f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = driver_data->local_rotation; 891f91c8768670386683a281cc39141e21bdda9c97fKun Wang else 892f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = 0; 8930da1930627209986e8db220799a690f816494401Austin Yuan } else if (pipeId == PIPEB) { 8940da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->extend_rotation != VA_ROTATION_NONE) { 8954d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng psb_surface = obj_surface->out_loop_surface; 8960da1930627209986e8db220799a690f816494401Austin Yuan width = obj_surface->width_r; 8970da1930627209986e8db220799a690f816494401Austin Yuan height = obj_surface->height_r; 8980da1930627209986e8db220799a690f816494401Austin Yuan if (driver_data->extend_rotation != VA_ROTATION_180) { 8990da1930627209986e8db220799a690f816494401Austin Yuan tmp = src_w; 9000da1930627209986e8db220799a690f816494401Austin Yuan src_w = src_h; 9010da1930627209986e8db220799a690f816494401Austin Yuan src_h = tmp; 9020da1930627209986e8db220799a690f816494401Austin Yuan } 9030da1930627209986e8db220799a690f816494401Austin Yuan } 904f91c8768670386683a281cc39141e21bdda9c97fKun Wang if ((driver_data->extend_rotation == VA_ROTATION_NONE) || 9053f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang (driver_data->extend_rotation == VA_ROTATION_180)) { 9060da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->extend_display_width; 9070da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->extend_display_height; 9080da1930627209986e8db220799a690f816494401Austin Yuan } else { 9090da1930627209986e8db220799a690f816494401Austin Yuan pPriv->width_save = pPriv->extend_display_height; 9100da1930627209986e8db220799a690f816494401Austin Yuan pPriv->height_save = pPriv->extend_display_width; 9110da1930627209986e8db220799a690f816494401Austin Yuan } 912f91c8768670386683a281cc39141e21bdda9c97fKun Wang if (driver_data->is_android == 0) 913f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = driver_data->extend_rotation; 914f91c8768670386683a281cc39141e21bdda9c97fKun Wang else 915f91c8768670386683a281cc39141e21bdda9c97fKun Wang pPriv->rotation = 0; 9160da1930627209986e8db220799a690f816494401Austin Yuan } 9170da1930627209986e8db220799a690f816494401Austin Yuan 9180da1930627209986e8db220799a690f816494401Austin Yuan *src_w_new = src_w; 9190da1930627209986e8db220799a690f816494401Austin Yuan *src_h_new = src_h; 9200da1930627209986e8db220799a690f816494401Austin Yuan *width_new = width; 9210da1930627209986e8db220799a690f816494401Austin Yuan *height_new = height; 9220da1930627209986e8db220799a690f816494401Austin Yuan *psb_surface_new = psb_surface; 9230da1930627209986e8db220799a690f816494401Austin Yuan} 9240da1930627209986e8db220799a690f816494401Austin Yuan 9250da1930627209986e8db220799a690f816494401Austin Yuan 926cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanstatic int I830PutImageFlipRotateDebug( 9270da1930627209986e8db220799a690f816494401Austin Yuan VADriverContextP ctx, 9280da1930627209986e8db220799a690f816494401Austin Yuan VASurfaceID surface, 929cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan short __maybe_unused src_x, short __maybe_unused src_y, 930cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan short __maybe_unused src_w, short __maybe_unused src_h, 931cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan short __maybe_unused drw_x, short __maybe_unused drw_y, 932cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan short __maybe_unused drw_w, short __maybe_unused drw_h, 933cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int __maybe_unused fourcc, int __maybe_unused flags, 934cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int __maybe_unused overlayId, 9350da1930627209986e8db220799a690f816494401Austin Yuan int pipeId) 9360da1930627209986e8db220799a690f816494401Austin Yuan{ 9370da1930627209986e8db220799a690f816494401Austin Yuan INIT_DRIVER_DATA; 9388bc6a6aa815a18f936036b5a47106b47aa904b1bhding object_surface_p obj_surface; 9390da1930627209986e8db220799a690f816494401Austin Yuan psb_surface_p psb_surface = NULL; 9408bc6a6aa815a18f936036b5a47106b47aa904b1bhding VAStatus vaStatus = VA_STATUS_SUCCESS; 9418bc6a6aa815a18f936036b5a47106b47aa904b1bhding 9428bc6a6aa815a18f936036b5a47106b47aa904b1bhding obj_surface = SURFACE(surface); 9438bc6a6aa815a18f936036b5a47106b47aa904b1bhding CHECK_SURFACE(obj_surface); 9440da1930627209986e8db220799a690f816494401Austin Yuan 9450da1930627209986e8db220799a690f816494401Austin Yuan if (pipeId != 0) 946cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan return -1; 9475b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 9484d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng psb_surface = obj_surface->out_loop_surface; 9490da1930627209986e8db220799a690f816494401Austin Yuan psb_buffer_p buf = &psb_surface->buf; 9500da1930627209986e8db220799a690f816494401Austin Yuan unsigned char *data, *chroma, *buffer, *header; 9510da1930627209986e8db220799a690f816494401Austin Yuan static FILE *pf = NULL; 9520da1930627209986e8db220799a690f816494401Austin Yuan int ret, i; 9530da1930627209986e8db220799a690f816494401Austin Yuan if (!psb_surface) 9540da1930627209986e8db220799a690f816494401Austin Yuan goto dump_out; 9550da1930627209986e8db220799a690f816494401Austin Yuan if (pf == NULL) 9568bc6a6aa815a18f936036b5a47106b47aa904b1bhding if ((pf = fopen("/home/dump.yuv", "w+")) == NULL) { 9570da1930627209986e8db220799a690f816494401Austin Yuan printf("Open yuv file fails\n"); 958cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan return -1; 9598bc6a6aa815a18f936036b5a47106b47aa904b1bhding } 9600da1930627209986e8db220799a690f816494401Austin Yuan ret = psb_buffer_map(buf, &data); 9610da1930627209986e8db220799a690f816494401Austin Yuan 9628bc6a6aa815a18f936036b5a47106b47aa904b1bhding if (ret) { 9630da1930627209986e8db220799a690f816494401Austin Yuan printf("Map buffer fail\n"); 964cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan return -1; 9658bc6a6aa815a18f936036b5a47106b47aa904b1bhding } 9660da1930627209986e8db220799a690f816494401Austin Yuan for (i = 0; i < obj_surface->height_r; i++) { 9670da1930627209986e8db220799a690f816494401Austin Yuan fwrite(data, 1, obj_surface->width_r, pf); 9680da1930627209986e8db220799a690f816494401Austin Yuan data += psb_surface->stride; 9690da1930627209986e8db220799a690f816494401Austin Yuan } 9700da1930627209986e8db220799a690f816494401Austin Yuan 9710da1930627209986e8db220799a690f816494401Austin Yuan buffer = malloc(obj_surface->height_r * obj_surface->width_r); 9728bc6a6aa815a18f936036b5a47106b47aa904b1bhding if (!buffer) { 9730da1930627209986e8db220799a690f816494401Austin Yuan printf("Alloc chroma buffer fail\n"); 974cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan return -1; 9758bc6a6aa815a18f936036b5a47106b47aa904b1bhding } 9760da1930627209986e8db220799a690f816494401Austin Yuan header = buffer; 9770da1930627209986e8db220799a690f816494401Austin Yuan chroma = data; 9780da1930627209986e8db220799a690f816494401Austin Yuan for (i = 0; i < obj_surface->height_r / 2; i++) { 9790da1930627209986e8db220799a690f816494401Austin Yuan int j; 9800da1930627209986e8db220799a690f816494401Austin Yuan for (j = 0; j < obj_surface->width_r / 2; j++) { 9810da1930627209986e8db220799a690f816494401Austin Yuan *buffer++ = data[j*2]; 9820da1930627209986e8db220799a690f816494401Austin Yuan } 9830da1930627209986e8db220799a690f816494401Austin Yuan data += psb_surface->stride; 9840da1930627209986e8db220799a690f816494401Austin Yuan } 9850da1930627209986e8db220799a690f816494401Austin Yuan 9860da1930627209986e8db220799a690f816494401Austin Yuan data = chroma; 9870da1930627209986e8db220799a690f816494401Austin Yuan for (i = 0; i < obj_surface->height_r / 2; i++) { 9880da1930627209986e8db220799a690f816494401Austin Yuan int j; 9890da1930627209986e8db220799a690f816494401Austin Yuan for (j = 0; j < obj_surface->width_r / 2; j++) { 9900da1930627209986e8db220799a690f816494401Austin Yuan *buffer++ = data[j*2 + 1]; 9910da1930627209986e8db220799a690f816494401Austin Yuan } 9920da1930627209986e8db220799a690f816494401Austin Yuan data += psb_surface->stride; 9930da1930627209986e8db220799a690f816494401Austin Yuan } 9940da1930627209986e8db220799a690f816494401Austin Yuan 9950da1930627209986e8db220799a690f816494401Austin Yuan fwrite(header, obj_surface->height_r / 2, obj_surface->width_r, pf); 9960da1930627209986e8db220799a690f816494401Austin Yuan free(header); 9970da1930627209986e8db220799a690f816494401Austin Yuan psb_buffer_unmap(buf); 998cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan return 0; 999cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan 10005b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wangdump_out: 1001cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan return -1; 10020da1930627209986e8db220799a690f816494401Austin Yuan} 10030da1930627209986e8db220799a690f816494401Austin Yuan 10040da1930627209986e8db220799a690f816494401Austin Yuan 10057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The source rectangle of the video is defined by (src_x, src_y, src_w, src_h). 10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The dest rectangle of the video is defined by (drw_x, drw_y, drw_w, drw_h). 10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * id is a fourcc code for the format of the video. 10097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buf is the pointer to the source data in system memory. 10107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * width and height are the w/h of the source data. 10117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * If "sync" is TRUE, then we must be finished with *buf at the point of return 10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * (which we always are). 10137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * clipBoxes is the clipping region in screen space. 10147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * data is a pointer to our port private. 10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * pDraw is a Drawable, which might not be the screen in the case of 10167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * compositing. It's a new argument to the function in the 1.1 server. 10177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1018437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int I830PutImage( 1019437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 1020437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 10210da1930627209986e8db220799a690f816494401Austin Yuan int src_x, int src_y, 10220da1930627209986e8db220799a690f816494401Austin Yuan int src_w, int src_h, 10230da1930627209986e8db220799a690f816494401Austin Yuan int drw_x, int drw_y, 10240da1930627209986e8db220799a690f816494401Austin Yuan int drw_w, int drw_h, 1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int fourcc, int flags, 1026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int overlayId, 10272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int pipeId) 10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 10297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 10307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int x1, x2, y1, y2; 10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int width, height; 1032437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int top, left, npixels; 1033437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int pitch = 0, pitch2 = 0; 1034437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int pre_add; 1035437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int gtt_ofs; 1036437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct _WsbmBufferObject *drm_buf; 10377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BoxRec dstBox; 10387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PsbPortPrivPtr pPriv; 1039437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 10402befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface_p psb_surface = NULL; 1041437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10422befccec034c13d34746a9e87149889d59ac767bFei Jiang /* silent kw */ 10432befccec034c13d34746a9e87149889d59ac767bFei Jiang if (NULL == obj_surface) 1044dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 1; 10452befccec034c13d34746a9e87149889d59ac767bFei Jiang 10462befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1048437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (fourcc) { 1049437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VA_FOURCC_NV12: 1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun width = obj_surface->width; 1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun height = obj_surface->height; 1052437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 1053437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun width = obj_surface->width; 1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun height = obj_surface->height; 1056437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 10577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1059dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* rotate support here: more check? 1060dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * and for oold also? 1061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 1062dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_surface = obj_surface->psb_surface; 10630da1930627209986e8db220799a690f816494401Austin Yuan I830PutImageFlipRotateSurface(ctx, obj_surface, 10640da1930627209986e8db220799a690f816494401Austin Yuan &src_w, &src_h, &width, &height, 10650da1930627209986e8db220799a690f816494401Austin Yuan &psb_surface, pipeId); 1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1067fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (NULL == psb_surface) { 1068fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /*Rotate surface may not be ready, so we have to discard this frame.*/ 1069c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Discard this frame if rotate surface hasn't be ready.\n"); 10705b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 10710a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang return 1; 10720a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang } 10732befccec034c13d34746a9e87149889d59ac767bFei Jiang width = (width <= 1920) ? width : 1920; 10742befccec034c13d34746a9e87149889d59ac767bFei Jiang 10757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* If dst width and height are less than 1/8th the src size, the 10767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * src/dst scale factor becomes larger than 8 and doesn't fit in 10777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the scale register. 10787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (src_w >= (drw_w * 8)) 1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_w = src_w / 7; 10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1082dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (src_h >= (drw_h * 8)) 1083dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drw_h = src_h / 7; 10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Clip */ 10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang x1 = src_x; 10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang x2 = src_x + src_w; 10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang y1 = src_y; 10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang y2 = src_y + src_h; 10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x1 = drw_x; 10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x2 = drw_x + drw_w; 10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y1 = drw_y; 10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y2 = drw_y + drw_h; 10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_CLIP_FUNC 10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!i830_get_crtc(pScrn, &crtc, &dstBox)) 10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return Success; 10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *Update drw_* and 'clipBoxes' according to current downscale/upscale state 11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Make sure the area determined by drw_* is in 'clipBoxes' 11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 11047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) { 11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang h_ratio = (float)pScrn->pScreen->height / pPriv->width_save; 11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang v_ratio = (float)pScrn->pScreen->width / pPriv->height_save; 11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang h_ratio = (float)pScrn->pScreen->width / pPriv->width_save; 11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang v_ratio = (float)pScrn->pScreen->height / pPriv->height_save; 11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Horizontal downscale/upscale */ 11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((int)h_ratio) 11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.x1 /= h_ratio; 11157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if (!(int)h_ratio) 11167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.x2 /= h_ratio; 11177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Vertical downscale/upscale */ 11197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((int)v_ratio) 11207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.y1 /= v_ratio; 11217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if (!(int)v_ratio) 11227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.y2 /= v_ratio; 11237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_x /= h_ratio; 11257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_y /= v_ratio; 11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_w /= h_ratio; 11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h /= v_ratio; 11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x1 = drw_x; 11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x2 = drw_x + drw_w; 11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y1 = drw_y; 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y2 = drw_y + drw_h; 11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Count in client supplied clipboxes */ 11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipRegion = clipBoxes; 11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_perform_clip(pScrn, vaPtr->clipbox, vaPtr->num_clipbox, clipBoxes, clipRegion, pDraw); 11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!i830_clip_video_helper(pScrn, 1139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &crtc, 1140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &dstBox, &x1, &x2, &y1, &y2, clipRegion, 1141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang width, height)) { 11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Fail to clip video to any crtc!\n", __FUNCTION__); 1143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (fourcc) { 1148affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 1149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = (width + 0x3) & ~0x3; 1150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pitch2 = psb_surface->stride; 11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 1152affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 1153affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 1154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = (width + 0x3) & ~0x3; 11557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 11567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE 1157437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case FOURCC_RGBA: 1158437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = width << 2; 11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1161affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 1162affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 1164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = width << 1; 11657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang top = (y1) & ~1; 11692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang left = (x1) & ~1; 1170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left; 11717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fourcc == VA_FOURCC_NV12) { 1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pre_add = psb_surface->buf.buffer_ofs; 1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun drm_buf = psb_surface->buf.drm_buf; 1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun gtt_ofs = wsbmBOOffsetHint(drm_buf) & 0x0FFFFFFF; 1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11770a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang /*skip pad bytes.*/ 1178605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang if (driver_data->local_rotation == VA_ROTATION_90) { 1179605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang left += ((src_w + 0xf) & ~0xf) - src_w; 1180605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang } else if (driver_data->local_rotation == VA_ROTATION_270) { 1181605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang top += ((src_h + 0xf) & ~0xf) - src_h; 1182605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang } else if (driver_data->local_rotation == VA_ROTATION_180) { 1183605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang left += ((src_w + 0xf) & ~0xf) - src_w; 1184605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang top += ((src_h + 0xf) & ~0xf) - src_h; 1185605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang } 1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->YBuf0offset = pre_add + gtt_ofs + top * pitch2 + left; 1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->YBuf1offset = pPriv->YBuf0offset; 1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->UBuf0offset = pre_add + gtt_ofs + (pitch2 * height) + top * (pitch2 / 2) + left; 1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->VBuf0offset = pPriv->UBuf0offset; 1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->UBuf1offset = pPriv->UBuf0offset; 1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->VBuf1offset = pPriv->UBuf0offset; 1192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else { 1193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //TBD 1194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //pPriv->YBuf0offset = pPriv->videoBuf0_gtt_offset << PAGE_SHIFT; 1195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //pPriv->YBuf1offset = pPriv->videoBuf1_gtt_offset << PAGE_SHIFT; 11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) { 1197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2 * width); 1198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * width / 2); 1199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * width); 1200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * width / 2); 12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 1202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2 * height); 1203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * height / 2); 1204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * height); 1205437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * height / 2); 12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE 1210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fourcc == FOURCC_RGBA \ 12113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang || (fourcc == FOURCC_XVVA \ 12123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang && (pPriv->rotation != RR_Rotate_0) \ 12133f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang && (vaPtr->dst_srf.fourcc == VA_FOURCC_RGBA))) 1214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang i830_display_video_sprite(pScrn, crtc, width, height, dstPitch, 1215437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &dstBox, sprite_offset); 1216437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 12182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang i830_display_video(ctx, pPriv, surface, fourcc, src_w, src_h, pitch2, pitch, 1219437b3eda28a4bf098efa80598cab67f190275266Fei Jiang x1, y1, x2, y2, &dstBox, src_w, src_h, 12202f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drw_w, drw_h, flags, overlayId, pipeId); 1221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang // FIXME : do I use two buffers here really? 1223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang // pPriv->curBuf = (pPriv->curBuf + 1) & 1; 1224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1225437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return Success; 1226437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12302befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic void psbPortPrivCreate(PsbPortPrivPtr pPriv) 1231437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 1232437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0 1233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang REGION_NULL(pScreen, &pPriv->clip); 12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1236437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* coeffs defaut value */ 1237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Value = OV_BRIGHTNESS_DEFAULT_VALUE; 1238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Fraction = 0; 12397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1240437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Value = OV_CONTRAST_DEFAULT_VALUE; 1241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Fraction = 0; 12427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->hue.Value = OV_HUE_DEFAULT_VALUE; 1244437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->hue.Fraction = 0; 12457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Value = OV_SATURATION_DEFAULT_VALUE; 1247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Fraction = 0; 12482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enabled = 0; 12492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enable_mask = 0; 12502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 0; 12512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayC_enabled = 0; 12524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayA_pipeId = PIPEA; 12534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayC_pipeId = PIPEB; 1254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* FIXME: is this right? set up to current screen size */ 1256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 1 1257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->width_save = 1024; 1258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->height_save = 600; 12597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1262437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void 1263437b3eda28a4bf098efa80598cab67f190275266Fei JiangpsbPortPrivDestroy(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 12653f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang I830StopVideo(ctx); 1266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnmap(pPriv->wsbo[0]); 12682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[0]); 12692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnmap(pPriv->wsbo[1]); 12702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[1]); 12712befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pPriv->is_mfld) { 1272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pPriv->p_iep_lite_context) 12732befccec034c13d34746a9e87149889d59ac767bFei Jiang free(pPriv->p_iep_lite_context); 12742befccec034c13d34746a9e87149889d59ac767bFei Jiang } 12752befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv->p_iep_lite_context = NULL; 1276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1277437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12786e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sangstatic int 12792befccec034c13d34746a9e87149889d59ac767bFei JiangpsbSetupImageVideoOverlay(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 1281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 12822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayA = NULL; 12832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayC = NULL; 1284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret; 12852befccec034c13d34746a9e87149889d59ac767bFei Jiang psbPortPrivCreate(pPriv); 1286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1288437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* use green as color key by default for android media player */ 12894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->colorKey = driver_data->color_key/*0x0440*/; 129035405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang 1291fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /*Bypass color correction. Because these color 129235405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang correction can be done in pipe color correction in future.*/ 129335405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang pPriv->brightness.Value = 0; /*-19*/ 129435405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang pPriv->contrast.Value = 0x40; /*75*/ 129535405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang pPriv->saturation.Value = 0x80; /*146*/ 129635405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang 1297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma5 = 0xc0c0c0; 1298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma4 = 0x808080; 1299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma3 = 0x404040; 1300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma2 = 0x202020; 1301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma1 = 0x101010; 1302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma0 = 0x080808; 1303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->rotation = VA_ROTATION_NONE; 1305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->subpic_clear_flag = 1; 13067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* gotta uninit this someplace */ 1308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang REGION_NULL(pScreen, &pPriv->clip); 13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* With LFP's we need to detect whether we're in One Line Mode, which 1312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * essentially means a resolution greater than 1024x768, and fix up 13132befccec034c13d34746a9e87149889d59ac767bFei Jiang * the scaler accordingly. 13142befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 1315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->scaleRatio = 0x10000; 1316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->oneLineMode = FALSE; 1317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 13182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmGenBuffers(driver_data->main_pool, 2, 1319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &pPriv->wsbo[0], 64 * 1024, /* 64k alignment */ 132041051cf68a4a61406a5adcb9412cd83035eb8b0dFei Jiang WSBM_PL_FLAG_TT); 1321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (ret) 13222befccec034c13d34746a9e87149889d59ac767bFei Jiang goto out_err; 1323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 13242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmBOData(pPriv->wsbo[0], 13252befccec034c13d34746a9e87149889d59ac767bFei Jiang 5 * 4096, 1326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang NULL, NULL, 1327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang WSBM_PL_FLAG_TT); 1328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (ret) 13292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo0; 1330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->regmap[0] = wsbmBOMap(pPriv->wsbo[0], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE); 13322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!pPriv->regmap[0]) { 13332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo0; 13342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 13362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmBOData(pPriv->wsbo[1], 13372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5 * 4096, 13382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang NULL, NULL, 13392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang WSBM_PL_FLAG_TT); 13402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (ret) 13412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo1; 13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->regmap[1] = wsbmBOMap(pPriv->wsbo[1], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE); 13442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!pPriv->regmap[1]) { 13452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo1; 13462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 13472befccec034c13d34746a9e87149889d59ac767bFei Jiang 13482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 1349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 1350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13512befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pPriv->is_mfld) { 13522befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_black_mode.value = 1; 13532befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_white_mode.value = 3; 13542befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->blueStretch_gain.value = 200; 13552befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->skinColorCorrection_gain.value = 100; 1356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->hue.value = (5.25f * (1 << 25)); 1357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->saturation.value = (1.07f * (1 << 25)); 1358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->brightness.value = (-10.1f * (1 << 10)); 1359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->contrast.value = (0.99f * (1 << 25)); 13602befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13622befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err_bo1: 13652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[1]); 1366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err_bo0: 13672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[0]); 13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout_err: 13706e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang return -1; 13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13732befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_init(VADriverContextP ctx) 13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1375b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 13772befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = &driver_data->coverlay_priv; 13783f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan struct drm_psb_register_rw_arg regs; 13796e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang int ret; 13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(pPriv, 0, sizeof(PsbPortPrivRec)); 138206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng pPriv->is_mfld = (IS_MFLD(driver_data) || IS_MRFL(driver_data)); 13833f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan 13846e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang ret = psbSetupImageVideoOverlay(ctx, pPriv); 13856e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang if (ret != 0) { 1386c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "psb_coverlay_init : Create overlay cmd buffer failed.\n"); 13876e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang return -1; 13886e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang } 13896e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang 13903f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan if (pPriv->is_mfld && driver_data->is_android) { 1391c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Android ExtVideo: set PIPEB(HDMI)display plane on the bottom.\n"); 13925b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 13933f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan memset(®s, 0, sizeof(regs)); 139454752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_read_mask = REGRWBITS_DSPBCNTR; 139554752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 139654752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display.dspcntr_b |= DISPPLANE_BOTTOM; 139754752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_write_mask = REGRWBITS_DSPBCNTR; 13983f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 13993f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan } 14005b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang 14014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830ResetVideo(ctx, pPriv); 14022befccec034c13d34746a9e87149889d59ac767bFei Jiang I830UpdateGamma(ctx, pPriv); 1403b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 14042befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14072befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_stop(VADriverContextP ctx) 14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14092befccec034c13d34746a9e87149889d59ac767bFei Jiang I830StopVideo(ctx); 14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14132befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_deinit(VADriverContextP ctx) 14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1415b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 1416437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 14172befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = &driver_data->coverlay_priv; 141854752e65b02b1a84c491e3f9c964046faeea306eKun Wang struct drm_psb_register_rw_arg regs; 141954752e65b02b1a84c491e3f9c964046faeea306eKun Wang 142054752e65b02b1a84c491e3f9c964046faeea306eKun Wang if (pPriv->is_mfld && driver_data->is_android) { 1421c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Android ExtVideo: set PIPEB(HDMI)display plane normal.\n"); 142254752e65b02b1a84c491e3f9c964046faeea306eKun Wang 142354752e65b02b1a84c491e3f9c964046faeea306eKun Wang memset(®s, 0, sizeof(regs)); 142454752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_read_mask = REGRWBITS_DSPBCNTR; 142554752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 142654752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display.dspcntr_b &= ~DISPPLANE_BOTTOM; 142754752e65b02b1a84c491e3f9c964046faeea306eKun Wang regs.display_write_mask = REGRWBITS_DSPBCNTR; 142854752e65b02b1a84c491e3f9c964046faeea306eKun Wang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 142954752e65b02b1a84c491e3f9c964046faeea306eKun Wang } 1430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14312befccec034c13d34746a9e87149889d59ac767bFei Jiang psbPortPrivDestroy(ctx, pPriv); 1432b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1436437b3eda28a4bf098efa80598cab67f190275266Fei JiangVAStatus psb_putsurface_overlay( 1437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 1438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 1439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 1440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 1441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short srcw, 1442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short srch, 14432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang short destx, 1444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short destw, 1446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short desth, 14472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int flags, /* de-interlacing flags */ 1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int overlayId, 14492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int pipeId 14502befccec034c13d34746a9e87149889d59ac767bFei Jiang) 14512befccec034c13d34746a9e87149889d59ac767bFei Jiang{ 1452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 1453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 14544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 1455ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#if 0 14564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((overlayId == OVERLAY_A) && (pPriv->overlayA_pipeId != pipeId)) { 14574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayA_pipeId = pipeId; 14584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830SwitchPipe(ctx, OVERLAY_A, pipeId); 1459c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "OverlayA switch pipe to %d, stop overlayA first.\n", pipeId); 1460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if ((overlayId == OVERLAY_C) && (pPriv->overlayC_pipeId != pipeId)) { 14614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->overlayC_pipeId = pipeId; 14624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo I830SwitchPipe(ctx, OVERLAY_C, pipeId); 1463c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "OverlayC switch pipe to %d, stop overlayC first.\n", pipeId); 14644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 1465ff410d8d5d8aeb6515dde481d0cfbc4b031a03fchding#endif 14662befccec034c13d34746a9e87149889d59ac767bFei Jiang I830PutImage(ctx, surface, srcx, srcy, srcw, srch, 14672befccec034c13d34746a9e87149889d59ac767bFei Jiang destx, desty, destw, desth, 14682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VA_FOURCC_NV12, flags, overlayId, pipeId); 1469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 14702befccec034c13d34746a9e87149889d59ac767bFei Jiang /* current surface is being displayed */ 1471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->cur_displaying_surface != VA_INVALID_SURFACE) 14722befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->last_displaying_surface = driver_data->cur_displaying_surface; 1473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_surface == NULL) { 1475c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid surface ID: 0x%08x\n", surface); 1476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_INVALID_SURFACE; 14777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14792befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_surface->display_timestamp = GetTickCount(); 1480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang driver_data->cur_displaying_surface = surface; 1481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14822befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_SUCCESS; 14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1484