psb_overlay.c revision 2f768e2db3e4074a6e9a3d5f0f6e321233d96e4c
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 22befccec034c13d34746a9e87149889d59ac767bFei Jiang * INTEL CONFIDENTIAL 32befccec034c13d34746a9e87149889d59ac767bFei Jiang * Copyright 2007 Intel Corporation. All Rights Reserved. 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 52befccec034c13d34746a9e87149889d59ac767bFei Jiang * The source code contained or described herein and all documents related to 62befccec034c13d34746a9e87149889d59ac767bFei Jiang * the source code ("Material") are owned by Intel Corporation or its suppliers 72befccec034c13d34746a9e87149889d59ac767bFei Jiang * or licensors. Title to the Material remains with Intel Corporation or its 82befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors. The Material may contain trade secrets and 92befccec034c13d34746a9e87149889d59ac767bFei Jiang * proprietary and confidential information of Intel Corporation and its 102befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors, and is protected by worldwide copyright and trade 112befccec034c13d34746a9e87149889d59ac767bFei Jiang * secret laws and treaty provisions. No part of the Material may be used, 122befccec034c13d34746a9e87149889d59ac767bFei Jiang * copied, reproduced, modified, published, uploaded, posted, transmitted, 132befccec034c13d34746a9e87149889d59ac767bFei Jiang * distributed, or disclosed in any way without Intel's prior express written 142befccec034c13d34746a9e87149889d59ac767bFei Jiang * permission. 152befccec034c13d34746a9e87149889d59ac767bFei Jiang * 162befccec034c13d34746a9e87149889d59ac767bFei Jiang * No license under any patent, copyright, trade secret or other intellectual 172befccec034c13d34746a9e87149889d59ac767bFei Jiang * property right is granted to or conferred upon you by disclosure or delivery 182befccec034c13d34746a9e87149889d59ac767bFei Jiang * of the Materials, either expressly, by implication, inducement, estoppel or 192befccec034c13d34746a9e87149889d59ac767bFei Jiang * otherwise. Any license under such intellectual property rights must be 202befccec034c13d34746a9e87149889d59ac767bFei Jiang * express and approved by Intel in writing. 217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <math.h> 277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <va/va_backend.h> 287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <psb_drm.h> 307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drv_video.h" 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_output.h" 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_overlay.h" 332befccec034c13d34746a9e87149889d59ac767bFei Jiang 342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#ifdef ANDROID 352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#define psb_xrandr_single_mode() 1 362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#else 372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "x11/psb_xrandr.h" 382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif 392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 402befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "img_iep_defs.h" 412befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "csc2.h" 422befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "iep_lite_api.h" 432befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "iep_lite_utils.h" 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData 462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 472befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) 482befccec034c13d34746a9e87149889d59ac767bFei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 492befccec034c13d34746a9e87149889d59ac767bFei Jiang 502befccec034c13d34746a9e87149889d59ac767bFei Jiang#ifndef VA_FOURCC_I420 512befccec034c13d34746a9e87149889d59ac767bFei Jiang#define VA_FOURCC_I420 0x30323449 522befccec034c13d34746a9e87149889d59ac767bFei Jiang#endif 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/********************************************************************************************** 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * I830ResetVideo 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Description: Use this function to reset the overlay register back buffer to its default 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * values. Note that this function does not actually apply these values. To do so, please 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * write to OVADD. 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang **********************************************************************************************/ 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangI830ResetVideo(PsbPortPrivPtr pPriv) 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(overlayA, 0, sizeof(*overlayA)); 682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(overlayC, 0, sizeof(*overlayC)); 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCLRC1 = pPriv->saturation.Value; 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCLRC0 = (pPriv->contrast.Value << 18) | (pPriv->brightness.Value & 0xff); 742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCLRC1 = pPriv->saturation.Value; 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DCLRK 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* case bit depth 16 */ 782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKV = RGB16ToColorKey(pPriv->colorKey); 792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM |= DEST_KEY_ENABLE; 802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM &= ~CONST_ALPHA_ENABLE; 812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKV = RGB16ToColorKey(pPriv->colorKey); 832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM |= DEST_KEY_ENABLE; 842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM &= ~CONST_ALPHA_ENABLE; 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DCLRKM &= ~DEST_KEY_ENABLE; 872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DCLRKM &= ~DEST_KEY_ENABLE; 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->DWINSZ = 0x00000000; 902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA->OCONFIG = CC_OUT_8BIT; 917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->DWINSZ = 0x00000000; 932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC->OCONFIG = CC_OUT_8BIT; 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t I830BoundGammaElt (uint32_t elt, uint32_t eltPrev) 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt &= 0xff; 997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang eltPrev &= 0xff; 1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (elt < eltPrev) 1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt = eltPrev; 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if ((elt - eltPrev) > 0x7e) 1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang elt = eltPrev + 0x7e; 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return elt; 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t I830BoundGamma (uint32_t gamma, uint32_t gammaPrev) 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (I830BoundGammaElt (gamma >> 24, gammaPrev >> 24) << 24 | 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang I830BoundGammaElt (gamma >> 16, gammaPrev >> 16) << 16 | 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang I830BoundGammaElt (gamma >> 8, gammaPrev >> 8) << 8 | 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang I830BoundGammaElt (gamma , gammaPrev )); 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangI830UpdateGamma(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma0 = pPriv->gamma0; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma1 = pPriv->gamma1; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma2 = pPriv->gamma2; 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma3 = pPriv->gamma3; 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma4 = pPriv->gamma4; 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t gamma5 = pPriv->gamma5; 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang gamma1 = I830BoundGamma (gamma1, gamma0); 1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang gamma2 = I830BoundGamma (gamma2, gamma1); 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang gamma3 = I830BoundGamma (gamma3, gamma2); 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang gamma4 = I830BoundGamma (gamma4, gamma3); 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang gamma5 = I830BoundGamma (gamma5, gamma4); 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 1342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->is_mfld) 1352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask |= OV_REGRWBITS_OGAM_ALL | OVC_REGRWBITS_OGAM_ALL; 1362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang else 1372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask |= OV_REGRWBITS_OGAM_ALL; 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC0 = gamma0; 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC1 = gamma1; 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC2 = gamma2; 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC3 = gamma3; 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC4 = gamma4; 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang regs.overlay.OGAMC5 = gamma5; 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 147437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void I830StopVideo(VADriverContextP ctx) 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1502befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 1512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang long offsetA = wsbmBOOffsetHint(pPriv->wsbo[0]) & 0x0FFFFFFF; 1522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang long offsetC = wsbmBOOffsetHint(pPriv->wsbo[1]) & 0x0FFFFFFF; 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGION_EMPTY(pScrn->pScreen, &pPriv->clip); 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang I830ResetVideo(pPriv); 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 1622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->subpicture_enabled ) { 1632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.subpicture_disable_mask = pPriv->subpicture_enable_mask; 1642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enabled = 0; 1652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(®s, 0, sizeof(regs)); 1692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->is_mfld && psb_xrandr_single_mode() == 0) { 1712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayC_enabled) { 1722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OVC_REGRWBITS_OVADD; 1732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD = offsetC; 1742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayC_enabled = 0; 1752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayA_enabled) { 1782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 1792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD = offsetA; 1802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 0; 1812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } else { 1842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 1852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD = offsetA; 1862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 0; 1872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 1882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangi830_swidth (unsigned int offset, unsigned int width, unsigned int mask, int shift) 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int swidth = ((offset + width + mask) >> shift) - (offset >> shift); 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 1; 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth -= 1; 1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return swidth << 2; 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic Bool 2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangSetCoeffRegs(double *coeff, int mantSize, coeffPtr pCoeff, int pos) 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int maxVal, icoeff, res; 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int sign; 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double c; 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sign = 0; 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang maxVal = 1 << mantSize; 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang c = *coeff; 2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (c < 0.0) { 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sign = 1; 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang c = -c; 2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang res = 12 - mantSize; 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) { 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 3; 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(4 * maxVal); 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) { 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 2; 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(2 * maxVal); 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) { 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 1; 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(maxVal); 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) { 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].exponent = 0; 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].mantissa = icoeff << res; 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = (double)icoeff / (double)(maxVal / 2); 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Coeff out of range */ 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return FALSE; 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pCoeff[pos].sign = sign; 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sign) 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *coeff = -(*coeff); 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return TRUE; 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangUpdateCoeff(int taps, double fCutoff, Bool isHoriz, Bool isY, coeffPtr pCoeff) 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i, j, j1, num, pos, mantSize; 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double pi = 3.1415926535, val, sinc, window, sum; 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS]; 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double diff; 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int tapAdjust[MAX_TAPS], tap2Fix; 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool isVertAndUV; 2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (isHoriz) 2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mantSize = 7; 2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mantSize = 6; 2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang isVertAndUV = !isHoriz && !isY; 2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang num = taps * 16; 2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < num * 2; i++) { 2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num); 2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val == 0.0) 2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sinc = 1.0; 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sinc = sin(val) / val; 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Hamming window */ 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang window = (0.5 - 0.5 * cos(i * pi / num)); 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rawCoeff[i] = sinc * window; 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Normalise the coefficients. */ 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i + j * 32; 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += rawCoeff[pos]; 2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i + j * 32; 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffs[i][j] = rawCoeff[pos] / sum; 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Set the register values. */ 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) { 2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = j + i * taps; 2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((j == (taps - 1) / 2) && !isVertAndUV) 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos); 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos); 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[0] = (taps - 1) / 2; 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) { 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[j1] = tapAdjust[0] - j; 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tapAdjust[++j1] = tapAdjust[0] + j; 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Adjust the coefficients. */ 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += coeffs[i][j]; 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sum != 1.0) { 3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j1 = 0; j1 < taps; j1++) { 3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tap2Fix = tapAdjust[j1]; 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang diff = 1.0 - sum; 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffs[i][tap2Fix] += diff; 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = tap2Fix + i * taps; 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV) 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos); 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SetCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos); 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum = 0.0; 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < taps; j++) 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang sum += coeffs[i][j]; 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (sum == 1.0) 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void 325437b3eda28a4bf098efa80598cab67f190275266Fei Jiangi830_display_video( 326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, PsbPortPrivPtr pPriv, VASurfaceID surface, 327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int id, short width, short height, 328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int dstPitch, int srcPitch, int x1, int y1, int x2, int y2, BoxPtr dstBox, 3292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang short src_w, short src_h, short drw_w, short drw_h, 3302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int flags, int overlayId, int pipeId) 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int swidth, swidthy, swidthuv; 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int mask, shift, offsety, offsetu; 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int tmp; 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t OCMD; 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool scaleChanged = FALSE; 3382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int offset = wsbmBOOffsetHint(pPriv->wsbo[overlayId]) & 0x0FFFFFFF; 3392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlay = (I830OverlayRegPtr)(pPriv->regmap[overlayId]); 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_register_rw_arg regs; 3412befccec034c13d34746a9e87149889d59ac767bFei Jiang CSC_sHSBCSettings sHSBCSettings; 3422befccec034c13d34746a9e87149889d59ac767bFei Jiang char * pcEnableIEP = NULL; 3432befccec034c13d34746a9e87149889d59ac767bFei Jiang int i32EnableIEP = 1; 344437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* FIXME: don't know who and why add this 345437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * comment it for full screen scale issue 346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * any concern contact qiang.miao@intel.com 347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 348437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0 349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if(drw_w >= 800) { 350437b3eda28a4bf098efa80598cab67f190275266Fei Jiang x2 = x2/4; 351437b3eda28a4bf098efa80598cab67f190275266Fei Jiang y2 = y2/4; 352437b3eda28a4bf098efa80598cab67f190275266Fei Jiang dstBox->x2 = dstBox->x2/4; 353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang dstBox->y2 = dstBox->y2/4; 354437b3eda28a4bf098efa80598cab67f190275266Fei Jiang drw_w = drw_w /4; 355437b3eda28a4bf098efa80598cab67f190275266Fei Jiang drw_h = drw_h /4; 356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang //FIXME(Ben):There is a hardware bug which prevents overlay from 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // being reenabled after being disabled. Until this is 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // fixed, don't disable the overlay. We just make it 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // fully transparent and set it's window size to zero. 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // once hardware is fixed, remove this line disabling 3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // CONST_ALPHA_ENABLE. 364437b3eda28a4bf098efa80598cab67f190275266Fei Jiang // if(IS_MRST(pDevice)) 365437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->DCLRKM &= ~CONST_ALPHA_ENABLE; 3662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->subpicture_enabled) 3672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->DCLRKM &= ~DEST_KEY_ENABLE; 3682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang else 3692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->DCLRKM |= DEST_KEY_ENABLE; 3702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 371437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->DCLRKV = RGB16ToColorKey(pPriv->colorKey); 3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_ROTATION_FUNC 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (pPriv->rotation) { 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case RR_Rotate_0: 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case RR_Rotate_90: 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->x1; 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x1 = dstBox->y1; 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y1 = pPriv->height_save - tmp; 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->x2; 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x2 = dstBox->y2; 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y2 = pPriv->height_save - tmp; 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->y1; 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y1 = dstBox->y2; 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y2 = tmp; 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case RR_Rotate_180: 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->x1; 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x1 = pPriv->width_save - dstBox->x2; 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x2 = pPriv->width_save - tmp; 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->y1; 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y1 = pPriv->height_save - dstBox->y2; 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y2 = pPriv->height_save - tmp; 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case RR_Rotate_270: 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->x1; 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x1 = pPriv->width_save - dstBox->y1; 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y1 = tmp; 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->x2; 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x2 = pPriv->width_save - dstBox->y2; 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y2 = tmp; 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = dstBox->x1; 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x1 = dstBox->x2; 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->x2 = tmp; 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) { 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = width; 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang width = height; 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang height = tmp; 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = drw_w; 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_w = drw_h; 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h = tmp; 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = src_w; 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang src_w = src_h; 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang src_h = tmp; 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->oneLineMode) { 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* change the coordinates with panel fitting active */ 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y1 = (((dstBox->y1 - 1) * pPriv->scaleRatio) >> 16) + 1; 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox->y2 = ((dstBox->y2 * pPriv->scaleRatio) >> 16) + 1; 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now, alter the height, so we scale to the correct size */ 4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h = ((drw_h * pPriv->scaleRatio) >> 16) + 1; 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang shift = 6; 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang mask = 0x3f; 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->curBuf == 0) { 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsety = pPriv->YBuf0offset; 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsetu = pPriv->UBuf0offset; 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsety = pPriv->YBuf1offset; 4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offsetu = pPriv->UBuf1offset; 4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (id) { 443affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTH = width | ((width/2 & 0x7ff) << 16); 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidthy = i830_swidth (offsety, width, mask, shift); 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidthuv = i830_swidth (offsetu, width/2, mask, shift); 4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = (swidthy) | (swidthuv << 16); 4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height | ((height / 2) << 16); 4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 450affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 451affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTH = width | ((width/2 & 0x7ff) << 16); 4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidthy = i830_swidth (offsety, width, mask, shift); 4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidthuv = i830_swidth (offsetu, width/2, mask, shift); 4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = (swidthy) | (swidthuv << 16); 4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height | ((height / 2) << 16); 4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 458affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 459affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTH = width; 4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth = ((offsety + (width << 1) + mask) >> shift) - 463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang (offsety >> shift); 4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 1; 4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth -= 1; 4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang swidth <<= 2; 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SWIDTHSW = swidth; 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->SHEIGHT = height; 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->DWINPOS = (dstBox->y1 << 16) | dstBox->x1; 4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->DWINSZ = (((dstBox->y2 - dstBox->y1) << 16) | 4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (dstBox->x2 - dstBox->x1)); 4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* buffer locations */ 4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0Y = pPriv->YBuf0offset; 4817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0U = pPriv->UBuf0offset; 4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_0V = pPriv->VBuf0offset; 4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1Y = pPriv->YBuf1offset; 4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1U = pPriv->UBuf1offset; 4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OBUF_1V = pPriv->VBuf1offset; 4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Calculate horizontal and vertical scaling factors and polyphase 4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * coefficients. 4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (1) { 4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int xscaleIntUV, xscaleFractUV; 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int yscaleIntUV, yscaleFractUV; 4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* UV is half the size of Y -- YUV420 */ 4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int uvratio = 2; 4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t newval; 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i, j, pos; 5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int deinterlace_factor; 5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Y down-scale factor as a multiple of 4096. 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((id == VA_FOURCC_NV12) && (0 != (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD )))) 5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deinterlace_factor = 2; 5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang deinterlace_factor = 1; 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* deinterlace requires twice of VSCALE setting*/ 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (src_w == drw_w && src_h == drw_h) 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFract = 1<<12; 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFract = (1<<12) / deinterlace_factor; 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFract = ((src_w - 1) << 12) / drw_w; 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFract = ((src_h - 1) << 12) / (deinterlace_factor * drw_h); 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Calculate the UV scaling factor. */ 5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFractUV = xscaleFract / uvratio; 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFractUV = yscaleFract / uvratio; 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * To keep the relative Y and UV ratios exact, round the Y scales 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * to a multiple of the Y/UV ratio. 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleFract = xscaleFractUV * uvratio; 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleFract = yscaleFractUV * uvratio; 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Integer (un-multiplied) values. */ 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleInt = xscaleFract >> 12; 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleInt = yscaleFract >> 12; 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xscaleIntUV = xscaleFractUV >> 12; 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang yscaleIntUV = yscaleFractUV >> 12; 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* shouldn't get here */ 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (xscaleInt > 7) { 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* shouldn't get here */ 5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (xscaleIntUV > 7) { 5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 552437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if(pPriv->is_mfld) 553437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleInt << 15) | 554437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 555437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 556437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleInt << 16) | 557437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 558437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->YRGBSCALE) { 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->YRGBSCALE = newval; 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 564437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if(pPriv->is_mfld) 565437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 566437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ((yscaleFractUV & 0xFFF) << 20); 567437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 568437b3eda28a4bf098efa80598cab67f190275266Fei Jiang newval = (xscaleIntUV << 16) | ((xscaleFractUV & 0xFFF) << 3) | 569437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ((yscaleFractUV & 0xFFF) << 20); 570437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->UVSCALE) { 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UVSCALE = newval; 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang newval = yscaleInt << 16 | yscaleIntUV; 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (newval != overlay->UVSCALEV) { 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang scaleChanged = TRUE; 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UVSCALEV = newval; 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Recalculate coefficients if the scaling changed. */ 5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Only Horizontal coefficients so far. 5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (scaleChanged) { 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double fCutoffY; 5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang double fCutoffUV; 5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = xscaleFract / 4096.0; 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = xscaleFractUV / 4096.0; 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Limit to between 1.0 and 3.0. */ 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffY < MIN_CUTOFF_FREQ) 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = MIN_CUTOFF_FREQ; 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffY > MAX_CUTOFF_FREQ) 5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffY = MAX_CUTOFF_FREQ; 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffUV < MIN_CUTOFF_FREQ) 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = MIN_CUTOFF_FREQ; 6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fCutoffUV > MAX_CUTOFF_FREQ) 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fCutoffUV = MAX_CUTOFF_FREQ; 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UpdateCoeff(N_HORIZ_Y_TAPS, fCutoffY, TRUE, TRUE, xcoeffY); 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UpdateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, TRUE, FALSE, xcoeffUV); 6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i * N_HORIZ_Y_TAPS + j; 6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->Y_HCOEFS[pos] = (xcoeffY[pos].sign << 15 | 6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffY[pos].exponent << 12 | 6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffY[pos].mantissa); 6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (i = 0; i < N_PHASES; i++) { 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pos = i * N_HORIZ_UV_TAPS + j; 6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->UV_HCOEFS[pos] = (xcoeffUV[pos].sign << 15 | 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffUV[pos].exponent << 12 | 6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xcoeffUV[pos].mantissa); 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD = OVERLAY_ENABLE; 6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (id) { 629affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = dstPitch | (dstPitch << 16); 6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= NV12;//in the spec, there are two NV12, which to use? 6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 635affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 636affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* set UV vertical phase to -0.25 */ 638437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* overlay->UV_VPH = 0x30003000; */ 6397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = (dstPitch * 2) | (dstPitch << 16); 6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 6417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 6427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= YUV_420; 6437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 644affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 645affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 6467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OSTRIDE = dstPitch; 6477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~SOURCE_FORMAT; 6487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= YUV_422; 6497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~OV_BYTE_ORDER; 650affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang if (id == VA_FOURCC_UYVY) 6517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= Y_SWAP; 6527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 655437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (flags & (VA_TOP_FIELD | VA_BOTTOM_FIELD )) { 656437b3eda28a4bf098efa80598cab67f190275266Fei Jiang OCMD |= BUF_TYPE_FIELD; 657437b3eda28a4bf098efa80598cab67f190275266Fei Jiang OCMD &= ~FIELD_SELECT; 658437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 659437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (flags & VA_BOTTOM_FIELD) { 660437b3eda28a4bf098efa80598cab67f190275266Fei Jiang OCMD |= FIELD1; 661437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->OBUF_0Y = pPriv->YBuf0offset - srcPitch; 662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->OBUF_0U = pPriv->UBuf0offset - srcPitch; 663437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->OBUF_0V = pPriv->VBuf0offset - srcPitch; 664437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->OBUF_1Y = pPriv->YBuf1offset - srcPitch; 665437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->OBUF_1U = pPriv->UBuf1offset - srcPitch; 666437b3eda28a4bf098efa80598cab67f190275266Fei Jiang overlay->OBUF_1V = pPriv->VBuf1offset - srcPitch; 667437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 668437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 669437b3eda28a4bf098efa80598cab67f190275266Fei Jiang OCMD |= FIELD0; 670437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else { 671437b3eda28a4bf098efa80598cab67f190275266Fei Jiang OCMD &= ~(FIELD_SELECT); 672437b3eda28a4bf098efa80598cab67f190275266Fei Jiang OCMD &= ~BUF_TYPE_FIELD; 6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD &= ~(BUFFER_SELECT); 6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->curBuf == 0) 6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= BUFFER0; 6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang OCMD |= BUFFER1; 6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang overlay->OCMD = OCMD; 6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(®s, 0, sizeof(regs)); 6852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang switch (overlayId){ 6862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case OVERLAY_A: 6872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 1; 6882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OV_REGRWBITS_OVADD; 6892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 6902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case OVERLAY_C: 6912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayC_enabled = 1; 6922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay_write_mask = OVC_REGRWBITS_OVADD; 6932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 6942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 6952befccec034c13d34746a9e87149889d59ac767bFei Jiang 6962befccec034c13d34746a9e87149889d59ac767bFei Jiang if(pPriv->is_mfld) { 6972befccec034c13d34746a9e87149889d59ac767bFei Jiang pcEnableIEP = getenv("ENABLE_IEP"); 6982befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pcEnableIEP) { 6992befccec034c13d34746a9e87149889d59ac767bFei Jiang if (strcmp(pcEnableIEP, "0") == 0) { 7002befccec034c13d34746a9e87149889d59ac767bFei Jiang i32EnableIEP = 0; 7012befccec034c13d34746a9e87149889d59ac767bFei Jiang } 7022befccec034c13d34746a9e87149889d59ac767bFei Jiang else if (strcmp(pcEnableIEP, "1") == 0) { 7032befccec034c13d34746a9e87149889d59ac767bFei Jiang i32EnableIEP = 1; 7042befccec034c13d34746a9e87149889d59ac767bFei Jiang } 7052befccec034c13d34746a9e87149889d59ac767bFei Jiang } else { 7062befccec034c13d34746a9e87149889d59ac767bFei Jiang i32EnableIEP = 0; 7072befccec034c13d34746a9e87149889d59ac767bFei Jiang } 7082befccec034c13d34746a9e87149889d59ac767bFei Jiang 7092befccec034c13d34746a9e87149889d59ac767bFei Jiang if (i32EnableIEP == 0) { 7102befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG = CC_OUT_8BIT; 7112befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG &= OVERLAY_C_PIPE_A | (~OVERLAY_C_PIPE_MASK); 7122befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG |= IEP_LITE_BYPASS; 7132befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.OVADD = offset | 1; 7142befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.IEP_ENABLED = 0; 7152befccec034c13d34746a9e87149889d59ac767bFei Jiang } 7162befccec034c13d34746a9e87149889d59ac767bFei Jiang else { 7172befccec034c13d34746a9e87149889d59ac767bFei Jiang #if 0 7182befccec034c13d34746a9e87149889d59ac767bFei Jiang printf("ble black %d white %d\n", 7192befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_black_mode.value, 7202befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_white_mode.value); 7212befccec034c13d34746a9e87149889d59ac767bFei Jiang #endif 7222befccec034c13d34746a9e87149889d59ac767bFei Jiang IEP_LITE_BlackLevelExpanderConfigure(pPriv->p_iep_lite_context, 7232befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_black_mode.value, 7242befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_white_mode.value); 7252befccec034c13d34746a9e87149889d59ac767bFei Jiang iep_lite_RenderCompleteCallback (pPriv->p_iep_lite_context); 7262befccec034c13d34746a9e87149889d59ac767bFei Jiang 7272befccec034c13d34746a9e87149889d59ac767bFei Jiang #if 0 7282befccec034c13d34746a9e87149889d59ac767bFei Jiang printf("bs gain %d, scc gain %d\n", 7292befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->blueStretch_gain.value, 7302befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->skinColorCorrection_gain.value); 7312befccec034c13d34746a9e87149889d59ac767bFei Jiang #endif 7322befccec034c13d34746a9e87149889d59ac767bFei Jiang IEP_LITE_BlueStretchConfigure(pPriv->p_iep_lite_context, 7332befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->blueStretch_gain.value); 7342befccec034c13d34746a9e87149889d59ac767bFei Jiang IEP_LITE_SkinColourCorrectionConfigure(pPriv->p_iep_lite_context, 7352befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->skinColorCorrection_gain.value); 7362befccec034c13d34746a9e87149889d59ac767bFei Jiang 7372befccec034c13d34746a9e87149889d59ac767bFei Jiang #if 0 7382befccec034c13d34746a9e87149889d59ac767bFei Jiang printf("hue %d saturation %d brightness %d contrast %d\n", 7392befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->hue.value, 7402befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->saturation.value, 7412befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->brightness.value, 7422befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->contrast.value); 7432befccec034c13d34746a9e87149889d59ac767bFei Jiang #endif 7442befccec034c13d34746a9e87149889d59ac767bFei Jiang #if 0 7452befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Hue = (img_int32) (5.25f * (1<<25)); 7462befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Saturation = (img_int32) (1.07f * (1<<25)); 7472befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Brightness = (img_int32) (-10.1f * (1<<10)); 7482befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Contrast = (img_int32) (0.99f * (1<<25)); 7492befccec034c13d34746a9e87149889d59ac767bFei Jiang #else 7502befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Hue = (img_int32) driver_data->hue.value; 7512befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Saturation = (img_int32) driver_data->saturation.value; 7522befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Brightness = (img_int32) driver_data->brightness.value; 7532befccec034c13d34746a9e87149889d59ac767bFei Jiang sHSBCSettings.i32Contrast = (img_int32) driver_data->contrast.value; 7542befccec034c13d34746a9e87149889d59ac767bFei Jiang #endif 7552befccec034c13d34746a9e87149889d59ac767bFei Jiang IEP_LITE_CSCConfigure(pPriv->p_iep_lite_context, 7562befccec034c13d34746a9e87149889d59ac767bFei Jiang CSC_COLOURSPACE_YCC_BT601, 7572befccec034c13d34746a9e87149889d59ac767bFei Jiang CSC_COLOURSPACE_RGB, 7582befccec034c13d34746a9e87149889d59ac767bFei Jiang &sHSBCSettings); 7592befccec034c13d34746a9e87149889d59ac767bFei Jiang 7602befccec034c13d34746a9e87149889d59ac767bFei Jiang overlay->OCONFIG = 0x18; 7612befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.OVADD = offset | 0x1d; 7622befccec034c13d34746a9e87149889d59ac767bFei Jiang 7632befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.IEP_ENABLED = 1; 7642befccec034c13d34746a9e87149889d59ac767bFei Jiang } 7652befccec034c13d34746a9e87149889d59ac767bFei Jiang } 766643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang else { 767643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang overlay->OCONFIG = CC_OUT_8BIT; 768643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang overlay->OCONFIG |= IEP_LITE_BYPASS; 769643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang regs.overlay.OVADD = offset | 1; 770643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 7712befccec034c13d34746a9e87149889d59ac767bFei Jiang 7722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if(pPriv->is_mfld) { 7732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang switch(pipeId) { 7742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case PIPEA: 7752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= OVERLAY_C_PIPE_A; 7762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 7772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 7782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case PIPEB: 7792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= OVERLAY_C_PIPE_B; 7802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 7812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD |= 0x80; 7822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 7832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang case PIPEC: 7842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= OVERLAY_C_PIPE_C; 7852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 7862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang regs.overlay.OVADD |= 0x40; 7872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 7882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 7892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= IEP_LITE_BYPASS; /* By pass IEP functionality */ 7902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= ZORDER_TOP; 7912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 7922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang else 7932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlay->OCONFIG |= pipeId << 18; /* mrst */ 7942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 7962befccec034c13d34746a9e87149889d59ac767bFei Jiang 7972befccec034c13d34746a9e87149889d59ac767bFei Jiang if(pPriv->is_mfld) { 7982befccec034c13d34746a9e87149889d59ac767bFei Jiang if (regs.overlay.IEP_ENABLED) { 7992befccec034c13d34746a9e87149889d59ac767bFei Jiang #if 0 8002befccec034c13d34746a9e87149889d59ac767bFei Jiang printf("regs.overlay BLE minmax 0x%x, BSSCC control 0x%x\n", 8012befccec034c13d34746a9e87149889d59ac767bFei Jiang regs.overlay.IEP_BLE_MINMAX, regs.overlay.IEP_BSSCC_CONTROL); 8022befccec034c13d34746a9e87149889d59ac767bFei Jiang #endif 8032befccec034c13d34746a9e87149889d59ac767bFei Jiang *(unsigned int *)((unsigned int)&(overlay->IEP_SPACE[0]) + 0x804) = regs.overlay.IEP_BLE_MINMAX; 8042befccec034c13d34746a9e87149889d59ac767bFei Jiang } 8052befccec034c13d34746a9e87149889d59ac767bFei Jiang } 8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The source rectangle of the video is defined by (src_x, src_y, src_w, src_h). 8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The dest rectangle of the video is defined by (drw_x, drw_y, drw_w, drw_h). 8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * id is a fourcc code for the format of the video. 8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buf is the pointer to the source data in system memory. 8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * width and height are the w/h of the source data. 8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * If "sync" is TRUE, then we must be finished with *buf at the point of return 8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * (which we always are). 8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * clipBoxes is the clipping region in screen space. 8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * data is a pointer to our port private. 8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * pDraw is a Drawable, which might not be the screen in the case of 8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * compositing. It's a new argument to the function in the 1.1 server. 8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 821437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int I830PutImage( 822437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 823437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 824437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short src_x, short src_y, 825437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short src_w, short src_h, 8262f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang short drw_x, short drw_y, 827437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short drw_w, short drw_h, 8282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int fourcc, int flags, 8292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int overlayId, 8302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int pipeId) 8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int x1, x2, y1, y2; 8347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int width, height; 835437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int top, left, npixels; 836437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int pitch = 0, pitch2 = 0; 837437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int pre_add; 838437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int gtt_ofs; 839437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct _WsbmBufferObject *drm_buf; 8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BoxRec dstBox; 8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PsbPortPrivPtr pPriv; 842437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 8432befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface_p psb_surface = NULL; 844437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 8452befccec034c13d34746a9e87149889d59ac767bFei Jiang /* silent kw */ 8462befccec034c13d34746a9e87149889d59ac767bFei Jiang if (NULL == obj_surface) 8472befccec034c13d34746a9e87149889d59ac767bFei Jiang return 1; 8482befccec034c13d34746a9e87149889d59ac767bFei Jiang 8492befccec034c13d34746a9e87149889d59ac767bFei Jiang /* rotate support here: more check? 8502befccec034c13d34746a9e87149889d59ac767bFei Jiang * and for oold also? 8512befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 8522befccec034c13d34746a9e87149889d59ac767bFei Jiang 8532befccec034c13d34746a9e87149889d59ac767bFei Jiang if(driver_data->rotate == VA_ROTATION_NONE) 8542befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface = obj_surface->psb_surface; 8552befccec034c13d34746a9e87149889d59ac767bFei Jiang else 8562befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_surface = obj_surface->psb_surface_rotate; 8572befccec034c13d34746a9e87149889d59ac767bFei Jiang 8582befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 8592befccec034c13d34746a9e87149889d59ac767bFei Jiang 860437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (fourcc) { 861437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VA_FOURCC_NV12: 8622befccec034c13d34746a9e87149889d59ac767bFei Jiang width = obj_surface->width_r; 8632befccec034c13d34746a9e87149889d59ac767bFei Jiang height = obj_surface->height_r; 864437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 865437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 8662befccec034c13d34746a9e87149889d59ac767bFei Jiang width = obj_surface->width_r; 8672befccec034c13d34746a9e87149889d59ac767bFei Jiang height = obj_surface->height_r; 868437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8712befccec034c13d34746a9e87149889d59ac767bFei Jiang width = (width <= 1920) ? width : 1920; 8722befccec034c13d34746a9e87149889d59ac767bFei Jiang 8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* If dst width and height are less than 1/8th the src size, the 8747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * src/dst scale factor becomes larger than 8 and doesn't fit in 8757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the scale register. 8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if(src_w >= (drw_w * 8)) 8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_w = src_w/7; 8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if(src_h >= (drw_h * 8)) 8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h = src_h/7; 8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Clip */ 8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang x1 = src_x; 8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang x2 = src_x + src_w; 8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang y1 = src_y; 8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang y2 = src_y + src_h; 8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x1 = drw_x; 8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x2 = drw_x + drw_w; 8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y1 = drw_y; 8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y2 = drw_y + drw_h; 8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_CLIP_FUNC 8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!i830_get_crtc(pScrn, &crtc, &dstBox)) 8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return Success; 8977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *Update drw_* and 'clipBoxes' according to current downscale/upscale state 9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Make sure the area determined by drw_* is in 'clipBoxes' 9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) { 9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang h_ratio = (float)pScrn->pScreen->height / pPriv->width_save; 9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang v_ratio = (float)pScrn->pScreen->width / pPriv->height_save; 9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang h_ratio = (float)pScrn->pScreen->width / pPriv->width_save; 9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang v_ratio = (float)pScrn->pScreen->height / pPriv->height_save; 9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Horizontal downscale/upscale */ 9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((int)h_ratio) 9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.x1 /= h_ratio; 9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if (!(int)h_ratio) 9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.x2 /= h_ratio; 9157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Vertical downscale/upscale */ 9177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((int)v_ratio) 9187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.y1 /= v_ratio; 9197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else if (!(int)v_ratio) 9207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipBoxes->extents.y2 /= v_ratio; 9217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_x /= h_ratio; 9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_y /= v_ratio; 9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_w /= h_ratio; 9257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drw_h /= v_ratio; 9267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x1 = drw_x; 9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.x2 = drw_x + drw_w; 9297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y1 = drw_y; 9307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dstBox.y2 = drw_y + drw_h; 9317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Count in client supplied clipboxes */ 9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang clipRegion = clipBoxes; 9347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_perform_clip(pScrn, vaPtr->clipbox, vaPtr->num_clipbox, clipBoxes, clipRegion, pDraw); 9357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!i830_clip_video_helper(pScrn, 937437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &crtc, 938437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &dstBox, &x1, &x2, &y1, &y2, clipRegion, 939437b3eda28a4bf098efa80598cab67f190275266Fei Jiang width, height)) { 9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Fail to clip video to any crtc!\n", __FUNCTION__); 941437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 9427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 9447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 945437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (fourcc) { 946affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_NV12: 947437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = (width + 0x3) & ~0x3; 948437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch2 = psb_surface->stride; 9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 950affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YV12: 951affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_I420: 952437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = (width + 0x3) & ~0x3; 9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE 955437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case FOURCC_RGBA: 956437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = width << 2; 9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 9587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 959affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_UYVY: 960affe0092cc1da6366d8338217c14e9c42bae2248Fei,Jiang case VA_FOURCC_YUY2: 9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 962437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pitch = width << 1; 9637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 9647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang top = (y1) & ~1; 9672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang left = (x1) & ~1; 968437b3eda28a4bf098efa80598cab67f190275266Fei Jiang npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left; 9697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 970437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fourcc == VA_FOURCC_NV12) { 971437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pre_add = psb_surface->buf.buffer_ofs; 972437b3eda28a4bf098efa80598cab67f190275266Fei Jiang drm_buf = psb_surface->buf.drm_buf; 973437b3eda28a4bf098efa80598cab67f190275266Fei Jiang gtt_ofs = wsbmBOOffsetHint(drm_buf) & 0x0FFFFFFF; 974437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 9752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->YBuf0offset = pre_add + gtt_ofs + top * pitch2 + left; 976437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->YBuf1offset = pPriv->YBuf0offset; 977437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf0offset = pre_add + gtt_ofs + (pitch2 * height) + top * (pitch2/2) + left; 978437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf0offset = pPriv->UBuf0offset; 979437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf1offset = pPriv->UBuf0offset; 980437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf1offset = pPriv->UBuf0offset; 981437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else { 982437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //TBD 983437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //pPriv->YBuf0offset = pPriv->videoBuf0_gtt_offset << PAGE_SHIFT; 984437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //pPriv->YBuf1offset = pPriv->videoBuf1_gtt_offset << PAGE_SHIFT; 9857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) { 986437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2 * width); 987437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * width / 2); 988437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * width); 989437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * width / 2); 9907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 991437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf0offset = pPriv->YBuf0offset + (pitch2 * height); 992437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf0offset = pPriv->UBuf0offset + (pitch2 * height / 2); 993437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->UBuf1offset = pPriv->YBuf1offset + (pitch2 * height); 994437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->VBuf1offset = pPriv->UBuf1offset + (pitch2 * height / 2); 9957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 996437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 997437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 9987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if USE_DISPLAY_C_SPRITE 999437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fourcc == FOURCC_RGBA \ 1000437b3eda28a4bf098efa80598cab67f190275266Fei Jiang || (fourcc == FOURCC_XVVA \ 1001437b3eda28a4bf098efa80598cab67f190275266Fei Jiang && (pPriv->rotation != RR_Rotate_0) \ 1002437b3eda28a4bf098efa80598cab67f190275266Fei Jiang && (vaPtr->dst_srf.fourcc == VA_FOURCC_RGBA))) 1003437b3eda28a4bf098efa80598cab67f190275266Fei Jiang i830_display_video_sprite(pScrn, crtc, width, height, dstPitch, 1004437b3eda28a4bf098efa80598cab67f190275266Fei Jiang &dstBox, sprite_offset); 1005437b3eda28a4bf098efa80598cab67f190275266Fei Jiang else 10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 10072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang i830_display_video(ctx, pPriv, surface, fourcc, src_w, src_h, pitch2, pitch, 1008437b3eda28a4bf098efa80598cab67f190275266Fei Jiang x1, y1, x2, y2, &dstBox, src_w, src_h, 10092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang drw_w, drw_h, flags, overlayId, pipeId); 1010437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1011437b3eda28a4bf098efa80598cab67f190275266Fei Jiang // FIXME : do I use two buffers here really? 1012437b3eda28a4bf098efa80598cab67f190275266Fei Jiang // pPriv->curBuf = (pPriv->curBuf + 1) & 1; 1013437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1014437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return Success; 1015437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1016437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1017437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1018437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10192befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic void psbPortPrivCreate(PsbPortPrivPtr pPriv) 1020437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 1021437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0 1022437b3eda28a4bf098efa80598cab67f190275266Fei Jiang REGION_NULL(pScreen, &pPriv->clip); 10237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 10247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1025437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* coeffs defaut value */ 1026437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Value = OV_BRIGHTNESS_DEFAULT_VALUE; 1027437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Fraction = 0; 10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1029437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Value = OV_CONTRAST_DEFAULT_VALUE; 1030437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Fraction = 0; 10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1032437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->hue.Value = OV_HUE_DEFAULT_VALUE; 1033437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->hue.Fraction = 0; 10347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1035437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Value = OV_SATURATION_DEFAULT_VALUE; 1036437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Fraction = 0; 10372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enabled = 0; 10382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enable_mask = 0; 10392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayA_enabled = 0; 10402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->overlayC_enabled = 0; 10412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1042437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* FIXME: is this right? set up to current screen size */ 1043437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 1 1044437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->width_save = 1024; 1045437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->height_save = 600; 10467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1047437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1048437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1049437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void 1050437b3eda28a4bf098efa80598cab67f190275266Fei JiangpsbPortPrivDestroy(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1051437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 10522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (pPriv->overlayA_enabled) 10532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830StopVideo(ctx); 1054437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10552f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnmap(pPriv->wsbo[0]); 10562f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[0]); 10572f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnmap(pPriv->wsbo[1]); 10582f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[1]); 10592befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pPriv->is_mfld) { 10602befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pPriv->p_iep_lite_context) 10612befccec034c13d34746a9e87149889d59ac767bFei Jiang free(pPriv->p_iep_lite_context); 10622befccec034c13d34746a9e87149889d59ac767bFei Jiang } 10632befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv->p_iep_lite_context = NULL; 1064437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1065437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1066437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic PsbPortPrivPtr 10672befccec034c13d34746a9e87149889d59ac767bFei JiangpsbSetupImageVideoOverlay(VADriverContextP ctx, PsbPortPrivPtr pPriv) 1068437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 1069437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 10702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayA = NULL; 10712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang I830OverlayRegPtr overlayC = NULL; 1072437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret; 10732befccec034c13d34746a9e87149889d59ac767bFei Jiang psbPortPrivCreate(pPriv); 1074437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1075437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1076437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* use green as color key by default for android media player */ 1077437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->colorKey = 0 /*0x0440*/; 1078437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1079437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->brightness.Value = -19; /* (255/219) * -16 */ 1080437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->contrast.Value = 75; /* 255/219 * 64 */ 1081437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->saturation.Value = 146; /* 128/112 * 128 */ 1082437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma5 = 0xc0c0c0; 1083437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma4 = 0x808080; 1084437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma3 = 0x404040; 1085437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma2 = 0x202020; 1086437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma1 = 0x101010; 1087437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->gamma0 = 0x080808; 1088437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1089437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->rotation = RR_Rotate_0; 10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1092437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* gotta uninit this someplace */ 1093437b3eda28a4bf098efa80598cab67f190275266Fei Jiang REGION_NULL(pScreen, &pPriv->clip); 10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1096437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* With LFP's we need to detect whether we're in One Line Mode, which 1097437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * essentially means a resolution greater than 1024x768, and fix up 10982befccec034c13d34746a9e87149889d59ac767bFei Jiang * the scaler accordingly. 10992befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 1100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->scaleRatio = 0x10000; 1101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pPriv->oneLineMode = FALSE; 1102437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 11032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmGenBuffers(driver_data->main_pool, 2, 11042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang &pPriv->wsbo[0], 0, 110541051cf68a4a61406a5adcb9412cd83035eb8b0dFei Jiang WSBM_PL_FLAG_TT); 1106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (ret) 11072befccec034c13d34746a9e87149889d59ac767bFei Jiang goto out_err; 1108437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 11092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmBOData(pPriv->wsbo[0], 11102befccec034c13d34746a9e87149889d59ac767bFei Jiang 5 * 4096, 1111437b3eda28a4bf098efa80598cab67f190275266Fei Jiang NULL, NULL, 1112437b3eda28a4bf098efa80598cab67f190275266Fei Jiang WSBM_PL_FLAG_TT); 1113437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (ret) 11142f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo0; 11152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 11162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->regmap[0] = wsbmBOMap(pPriv->wsbo[0], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE); 11172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!pPriv->regmap[0]) { 11182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo0; 11192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 11212f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ret = wsbmBOData(pPriv->wsbo[1], 11222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5 * 4096, 11232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang NULL, NULL, 11242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang WSBM_PL_FLAG_TT); 11252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (ret) 11262f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo1; 11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->regmap[1] = wsbmBOMap(pPriv->wsbo[1], WSBM_ACCESS_READ | WSBM_ACCESS_WRITE); 11292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!pPriv->regmap[1]) { 11302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo1; 11312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 11322befccec034c13d34746a9e87149889d59ac767bFei Jiang 11332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayA = (I830OverlayRegPtr)(pPriv->regmap[0]); 11342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang overlayC = (I830OverlayRegPtr)(pPriv->regmap[1]); 11352befccec034c13d34746a9e87149889d59ac767bFei Jiang 11362befccec034c13d34746a9e87149889d59ac767bFei Jiang if (pPriv->is_mfld) { 11372befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv->p_iep_lite_context = (void *)calloc(1, sizeof(IEP_LITE_sContext)); 11382befccec034c13d34746a9e87149889d59ac767bFei Jiang if (NULL == pPriv->p_iep_lite_context) 11392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang goto out_err_bo1; 11402befccec034c13d34746a9e87149889d59ac767bFei Jiang 11412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang IEP_LITE_Initialise(pPriv->p_iep_lite_context,(unsigned int)&overlayA->IEP_SPACE[0]); 11422f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang IEP_LITE_Initialise(pPriv->p_iep_lite_context,(unsigned int)&overlayC->IEP_SPACE[0]); 11432befccec034c13d34746a9e87149889d59ac767bFei Jiang 11442befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_black_mode.value = 1; 11452befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ble_white_mode.value = 3; 11462befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->blueStretch_gain.value = 200; 11472befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->skinColorCorrection_gain.value = 100; 11482befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->hue.value = (5.25f * (1<<25)); 11492befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->saturation.value = (1.07f * (1<<25)); 11502befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->brightness.value = (-10.1f * (1<<10)); 11512befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->contrast.value = (0.99f * (1<<25)); 11522befccec034c13d34746a9e87149889d59ac767bFei Jiang } 11532befccec034c13d34746a9e87149889d59ac767bFei Jiang 11542befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 11557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11562f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang out_err_bo1: 11572f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[1]); 11582f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang out_err_bo0: 11592f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang wsbmBOUnreference(&pPriv->wsbo[0]); 11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang out_err: 11622befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11652befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_init(VADriverContextP ctx) 11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 11682befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = &driver_data->coverlay_priv; 11697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11702befccec034c13d34746a9e87149889d59ac767bFei Jiang pPriv->is_mfld = IS_MFLD(driver_data); 11712befccec034c13d34746a9e87149889d59ac767bFei Jiang psbSetupImageVideoOverlay(ctx, pPriv); 1172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 11732befccec034c13d34746a9e87149889d59ac767bFei Jiang I830ResetVideo(pPriv); 11742befccec034c13d34746a9e87149889d59ac767bFei Jiang I830UpdateGamma(ctx, pPriv); 11752befccec034c13d34746a9e87149889d59ac767bFei Jiang 11762befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 11777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11792befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_stop(VADriverContextP ctx) 11807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 11812befccec034c13d34746a9e87149889d59ac767bFei Jiang I830StopVideo(ctx); 11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11852befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_deinit(VADriverContextP ctx) 11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 11882befccec034c13d34746a9e87149889d59ac767bFei Jiang PsbPortPrivPtr pPriv = &driver_data->coverlay_priv; 11892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 11902befccec034c13d34746a9e87149889d59ac767bFei Jiang psbPortPrivDestroy(ctx, pPriv); 11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 11937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1195437b3eda28a4bf098efa80598cab67f190275266Fei JiangVAStatus psb_putsurface_overlay( 1196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VADriverContextP ctx, 1197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VASurfaceID surface, 1198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcx, 1199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short srcy, 12002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned short srcw, 12012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned short srch, 12022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang short destx, 1203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang short desty, 12042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned short destw, 12052f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned short desth, 12062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang unsigned int flags, /* de-interlacing flags */ 12072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int overlayId, 12082f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int pipeId 12092befccec034c13d34746a9e87149889d59ac767bFei Jiang) 12102befccec034c13d34746a9e87149889d59ac767bFei Jiang{ 1211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 1212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_surface_p obj_surface = SURFACE(surface); 1213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12142befccec034c13d34746a9e87149889d59ac767bFei Jiang I830PutImage(ctx, surface, srcx, srcy, srcw, srch, 12152befccec034c13d34746a9e87149889d59ac767bFei Jiang destx, desty, destw, desth, 12162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang VA_FOURCC_NV12, flags, overlayId, pipeId); 1217437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12182befccec034c13d34746a9e87149889d59ac767bFei Jiang /* current surface is being displayed */ 12192befccec034c13d34746a9e87149889d59ac767bFei Jiang if (driver_data->cur_displaying_surface != VA_INVALID_SURFACE) 12202befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->last_displaying_surface = driver_data->cur_displaying_surface; 12212befccec034c13d34746a9e87149889d59ac767bFei Jiang 12222befccec034c13d34746a9e87149889d59ac767bFei Jiang if (obj_surface == NULL) 1223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 12242befccec034c13d34746a9e87149889d59ac767bFei Jiang psb__error_message("Invalid surface ID: 0x%08x\n", surface); 12252befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_ERROR_INVALID_SURFACE; 12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12282befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_surface->display_timestamp = GetTickCount(); 1229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang driver_data->cur_displaying_surface = surface; 12302befccec034c13d34746a9e87149889d59ac767bFei Jiang 12312befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_SUCCESS; 12327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1233