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