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(&regs, 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, &regs, 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(&regs, 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, &regs, sizeof(regs));
1662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
1672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    memset(&regs, 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, &regs, 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, &regs, 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, &regs, 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(&regs, 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, &regs, 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