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:
113f3d1e8746d2b793c982ac19a73061e006b1b178Kun 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.
153f3d1e8746d2b793c982ac19a73061e006b1b178Kun 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 *    Zhaohan Ren  <zhaohan.ren@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <va/va_backend.h>
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_surface.h"
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_output.h"
342befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "psb_surface_ext.h"
352befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "psb_x11.h"
362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "psb_xrandr.h"
37f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h"
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <X11/extensions/dpms.h>
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
442befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_OUTPUT_PRIV    psb_x11_output_p output = (psb_x11_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv)
452befccec034c13d34746a9e87149889d59ac767bFei Jiang
46bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define SURFACE(id)     ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int psb_CheckDrawable(VADriverContextP ctx, Drawable draw);
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
50437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint (*oldHandler)(Display *, XErrorEvent *) = 0;
51437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int XErrorFlag = 1;
52437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int psb_XErrorHandler(Display *dpy, XErrorEvent *event)
53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
54c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "XErrorEvent caught in psb_XErrorHandler in psb_xvva.c\n");
55dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (event->type == 0 && event->request_code == 132 && event->error_code == 11 /* BadAlloc */) {
56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XErrorFlag = 1;
57dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return 0;
58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return oldHandler(dpy, event);
60437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
622befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic int GetPortId(VADriverContextP ctx, psb_x11_output_p output)
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i, j, k;
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int numAdapt;
66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int numImages;
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XvImageFormatValues *formats;
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XvAdaptorInfo *info;
692befccec034c13d34746a9e87149889d59ac767bFei Jiang    int ret, grab_ret;
702befccec034c13d34746a9e87149889d59ac767bFei Jiang    Display *dpy = (Display *)ctx->native_dpy;
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = XvQueryAdaptors(dpy, DefaultRootWindow(dpy), &numAdapt, &info);
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*Force overlay port num equal to one. OverlayC can't be used independently now.*/
74030d8371cbd338afae0c5a7e753b6c890eaa34c3Fei Jiang    /* check for numAdapt before modifying the info[1]. Without this check
75030d8371cbd338afae0c5a7e753b6c890eaa34c3Fei Jiang     * it will cause a memory corruption leading to segfaults */
76030d8371cbd338afae0c5a7e753b6c890eaa34c3Fei Jiang    if (numAdapt > 1)
77030d8371cbd338afae0c5a7e753b6c890eaa34c3Fei Jiang        info[1].num_ports = 1;
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
792befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (Success != ret) {
80c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Can't find Xvideo adaptor\n");
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return -1;
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
842befccec034c13d34746a9e87149889d59ac767bFei Jiang    grab_ret = XGrabServer(ctx->native_dpy);
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < numAdapt; i++) {
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((info[i].type & XvImageMask) == 0)
872befccec034c13d34746a9e87149889d59ac767bFei Jiang            continue;
88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
892befccec034c13d34746a9e87149889d59ac767bFei Jiang        formats = XvListImageFormats(dpy, info[i].base_id, &numImages);
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for (j = 0; j < numImages; j++) {
912befccec034c13d34746a9e87149889d59ac767bFei Jiang            if (formats[j].id != FOURCC_XVVA) continue;
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            for (k = 0; k < info[i].num_ports; k++) {
932befccec034c13d34746a9e87149889d59ac767bFei Jiang                int ret = XvGrabPort(dpy, info[i].base_id + k, CurrentTime);
94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
952befccec034c13d34746a9e87149889d59ac767bFei Jiang                if (Success == ret) {
962befccec034c13d34746a9e87149889d59ac767bFei Jiang                    /* for textured adaptor 0 */
972befccec034c13d34746a9e87149889d59ac767bFei Jiang                    if (i == 0)
982befccec034c13d34746a9e87149889d59ac767bFei Jiang                        output->textured_portID = info[i].base_id + k;
992befccec034c13d34746a9e87149889d59ac767bFei Jiang                    /* for overlay adaptor 1 */
1002befccec034c13d34746a9e87149889d59ac767bFei Jiang                    if (i == 1)
1012befccec034c13d34746a9e87149889d59ac767bFei Jiang                        output->overlay_portID = info[i].base_id + k;
1022befccec034c13d34746a9e87149889d59ac767bFei Jiang                    break;
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
1052befccec034c13d34746a9e87149889d59ac767bFei Jiang        }
1062befccec034c13d34746a9e87149889d59ac767bFei Jiang        XFree(formats);
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1092befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (grab_ret != 0)
1102befccec034c13d34746a9e87149889d59ac767bFei Jiang        XUngrabServer(ctx->native_dpy);
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1122befccec034c13d34746a9e87149889d59ac767bFei Jiang    if ((output->textured_portID == 0) && (output->overlay_portID == 0)) {
113c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Can't detect any usable Xv XVVA port\n");
114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return -1;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1202befccec034c13d34746a9e87149889d59ac767bFei Jiang
1212befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_init_xvideo(VADriverContextP ctx, psb_x11_output_p output)
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
123f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef _FOR_FPGA_
124f31d5416a60f83e184b0906a7ec77ba021840531hding    return VA_STATUS_SUCCESS;
125f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
126f31d5416a60f83e184b0906a7ec77ba021840531hding
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
1284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int dummy, ret;
129437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    output->textured_portID = output->overlay_portID = 0;
1312befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (GetPortId(ctx, output)) {
132c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Grab Xvideo port failed, fallback to software vaPutSurface.\n");
1332befccec034c13d34746a9e87149889d59ac767bFei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->textured_portID)
137c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Detected textured Xvideo port_id = %d.\n", (unsigned int)output->textured_portID);
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->overlay_portID)
139c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Detected overlay  Xvideo port_id = %d.\n", (unsigned int)output->overlay_portID);
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1412befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->sprite_enabled = 0;
1422befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (getenv("PSB_SPRITE_ENABLE")) {
143c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "use sprite plane to playback rotated protected video\n");
1442befccec034c13d34746a9e87149889d59ac767bFei Jiang        output->sprite_enabled = 1;
1452befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    output->ignore_dpm = 1;
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (getenv("PSB_VIDEO_DPMS_HACK")) {
149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (DPMSQueryExtension((Display *)ctx->native_dpy, &dummy, &dummy)
150bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            && DPMSCapable((Display *)ctx->native_dpy)) {
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            BOOL onoff;
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            CARD16 state;
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DPMSInfo((Display *)ctx->native_dpy, &state, &onoff);
155c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "DPMS is %s, monitor state=%s\n", onoff ? "enabled" : "disabled",
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     (state == DPMSModeOn) ? "on" : (
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         (state == DPMSModeOff) ? "off" : (
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                             (state == DPMSModeStandby) ? "standby" : (
159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                                 (state == DPMSModeSuspend) ? "suspend" : "unknow"))));
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (onoff)
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                output->ignore_dpm = 0;
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1652befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* by default, overlay Xv */
1662befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output->textured_portID)
1672befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_TEXTURE;
1682befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output->overlay_portID)
1692befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_OVERLAY;
1702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = psb_xrandr_init(ctx);
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret != 0) {
173c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to initialize psb xrandr error # %d\n", __func__, ret);
174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
1754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
1764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_deinit_xvideo(VADriverContextP ctx)
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    INIT_DRIVER_DATA;
1842befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->gc) {
187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XFreeGC((Display *)ctx->native_dpy, output->gc);
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->gc = NULL;
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (output->extend_gc) {
192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XFreeGC((Display *)ctx->native_dpy, output->extend_gc);
193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        output->extend_gc = NULL;
1942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->textured_xvimage) {
197c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Destroy XvImage for texture Xv\n");
198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XFree(output->textured_xvimage);
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->textured_xvimage = NULL;
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->overlay_xvimage) {
203c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Destroy XvImage for overlay  Xv\n");
204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XFree(output->overlay_xvimage);
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->textured_xvimage = NULL;
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->textured_portID) {
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if ((output->using_port == USING_TEXTURE_PORT) && output->output_drawable
210bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            && (psb_CheckDrawable(ctx, output->output_drawable) == 0)) {
211c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Deinit: stop textured Xvideo\n");
212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XvStopVideo((Display *)ctx->native_dpy, output->textured_portID, output->output_drawable);
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
215c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Deinit: ungrab textured Xvideo port\n");
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XvUngrabPort((Display *)ctx->native_dpy, output->textured_portID, CurrentTime);
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        output->textured_portID = 0;
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->overlay_portID) {
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if ((output->using_port == USING_OVERLAY_PORT) && output->output_drawable
222bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            && (psb_CheckDrawable(ctx, output->output_drawable) == 0)) {
223c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Deinit: stop overlay Xvideo\n");
224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XvStopVideo((Display *)ctx->native_dpy, output->overlay_portID, output->output_drawable);
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
227c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Deinit: ungrab overlay Xvideo port\n");
228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XvUngrabPort((Display *)ctx->native_dpy, output->overlay_portID, CurrentTime);
229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        output->overlay_portID = 0;
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
2324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (driver_data->use_xrandr_thread && driver_data->xrandr_thread_id) {
233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_thread_exit();
2344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pthread_join(driver_data->xrandr_thread_id, NULL);
235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->xrandr_thread_id = 0;
2362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_deinit();
2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    output->using_port = 0;
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    output->output_drawable = 0;
2412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    output->extend_drawable = 0;
242f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef _FOR_FPGA_
243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    XSync((Display *)ctx->native_dpy, False);
244f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_surface_init(
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_driver_data_p driver_data,
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    PsbVASurfaceRec *srf,
252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int fourcc, int bpp, int w, int h, int stride, int size, unsigned int pre_add,
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmBufferObject *bo, int flags
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun)
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    memset(srf, 0, sizeof(*srf));
257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    srf->fourcc = fourcc;
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    srf->bo = bo;
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (bo != NULL) {
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        srf->bufid = wsbmKBufHandle(wsbmKBuf(bo));
2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        srf->pl_flags = wsbmBOPlacementHint(bo);
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
265fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (srf->pl_flags & DRM_PSB_FLAG_MEM_CI)
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        srf->reserved_phyaddr = driver_data->camera_phyaddr;
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (srf->pl_flags & DRM_PSB_FLAG_MEM_RAR)
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        srf->reserved_phyaddr = driver_data->rar_phyaddr;
270fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang*/
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    srf->bytes_pp = bpp;
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    srf->width = w;
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    srf->pre_add = pre_add;
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((flags == VA_TOP_FIELD) || (flags == VA_BOTTOM_FIELD)) {
2762befccec034c13d34746a9e87149889d59ac767bFei Jiang        if (driver_data->output_method ==  PSB_PUTSURFACE_FORCE_OVERLAY
277bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || driver_data->output_method == PSB_PUTSURFACE_OVERLAY) {
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            srf->height = h;
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            srf->stride = stride;
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            srf->height = h / 2;
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            srf->stride = stride * 2;
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (flags == VA_BOTTOM_FIELD)
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            srf->pre_add += stride;
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else {
2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        srf->height = h;
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        srf->stride = stride;
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    srf->size = size;
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (flags == VA_CLEAR_DRAWABLE) {
2942befccec034c13d34746a9e87149889d59ac767bFei Jiang        srf->clear_color = driver_data->clear_color; /* color */
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return;
2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define WINDOW 1
3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PIXMAP 0
3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* return 0 for no rotation, 1 for rotation occurs */
3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* XRRGetScreenInfo has significant performance drop */
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int  psb__CheckCurrentRotation(VADriverContextP ctx)
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Rotation current_rotation;
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XRRScreenConfiguration *scrn_cfg;
310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    scrn_cfg = XRRGetScreenInfo((Display *)ctx->native_dpy, DefaultRootWindow((Display *)ctx->native_dpy));
311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    XRRConfigCurrentConfiguration(scrn_cfg, &current_rotation);
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XRRFreeScreenConfigInfo(scrn_cfg);
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (current_rotation & 0x0f);
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Check drawable type, 1 for window, 0 for pixmap
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Have significant performance drop in XFCE environment
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__CheckDrawableType(Display *dpy, Window win, Drawable draw, int *type_ret)
3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int child_num;
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Window root_return;
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Window parent_return;
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Window *child_return;
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (win == draw) {
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *type_ret = 1;
330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XQueryTree(dpy, win, &root_return, &parent_return, &child_return, &child_num);
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!child_num)
336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < child_num; i++)
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__CheckDrawableType(dpy, child_return[i], draw, type_ret);
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int psb_CheckDrawable(VADriverContextP ctx, Drawable draw)
3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3462befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_DRIVER_DATA;
3472befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
348437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    Atom xvDrawable = XInternAtom((Display *)ctx->native_dpy, "XV_DRAWABLE", 0);
3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int val = 0;
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3512befccec034c13d34746a9e87149889d59ac767bFei Jiang    driver_data->drawable_info = 0;
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->overlay_portID) {
353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XvSetPortAttribute((Display *)ctx->native_dpy, output->overlay_portID, xvDrawable, draw);
354437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XvGetPortAttribute((Display *)ctx->native_dpy, output->overlay_portID, xvDrawable, &val);
3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else if (output->textured_portID) {
356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XvSetPortAttribute((Display *)ctx->native_dpy, output->textured_portID, xvDrawable, draw);
357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XvGetPortAttribute((Display *)ctx->native_dpy, output->textured_portID, xvDrawable, &val);
3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3592befccec034c13d34746a9e87149889d59ac767bFei Jiang    driver_data->drawable_info = val;
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
361c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Get xvDrawable = 0x%08x\n", val);
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3632befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->drawable_info == XVDRAWABLE_INVALID_DRAWABLE)
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1;
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int psb__CheckPutSurfaceXvPort(
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VADriverContextP ctx,
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VASurfaceID surface,
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Drawable draw, /* X Drawable */
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short srcx,
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short srcy,
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short srcw,
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short srch,
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short destx,
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short desty,
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short destw,
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short desth,
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VARectangle *cliprects, /* client supplied clip list */
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int flags /* de-interlacing flags */
384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun)
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
3872befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_surface_p obj_surface = SURFACE(surface);
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t buf_pl;
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* silent klockwork */
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (obj_surface && obj_surface->psb_surface)
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf_pl = obj_surface->psb_surface->buf.pl_flags;
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1;
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (flags & VA_CLEAR_DRAWABLE)
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->overlay_portID == 0) { /* no overlay usable */
4012befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_TEXTURE;
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4052befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->output_method == PSB_PUTSURFACE_FORCE_OVERLAY) {
406c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Force Overlay Xvideo for PutSurface\n");
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4102befccec034c13d34746a9e87149889d59ac767bFei Jiang    if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXTURE)) {
411c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Force Textured Xvideo for PutSurface\n");
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
415fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (((buf_pl & (WSBM_PL_FLAG_TT)) == 0) /* buf not in TT/RAR or CI */
416bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        || (obj_surface->width > 1920)  /* overlay have isue to support >1920xXXX resolution */
417bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        || (obj_surface->subpic_count > 0)  /* overlay can't support subpicture */
418bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /*    || (flags & (VA_TOP_FIELD|VA_BOTTOM_FIELD))*/
419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun       ) {
4202befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_TEXTURE;
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Here should be overlay XV by defaut after overlay is stable */
4262befccec034c13d34746a9e87149889d59ac767bFei Jiang    driver_data->output_method = PSB_PUTSURFACE_OVERLAY;
4272befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* driver_data->output_method = PSB_PUTSURFACE_TEXTURE; */
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *Query Overlay Adaptor by XvDrawable Attribute to know current
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Xrandr information:rotation/downscaling
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * also set target drawable(window vs pixmap) into XvDrawable
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * to levage Xserver to determiate it is Pixmap or Window
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *ROTATE_90: 0x2, ROTATE_180: 0x4, ROTATE_270:0x8
437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     *Overlay adopator can support video rotation,
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *but its performance is lower than texture video path.
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *When video protection and rotation are required (use RAR buffer),
4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *only overlay adaptor will be used.
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *other attribute like down scaling and pixmap, use texture adaptor
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     */
4432befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->drawable_info
444bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        & (XVDRAWABLE_ROTATE_180 | XVDRAWABLE_ROTATE_90 | XVDRAWABLE_ROTATE_270)) {
4452befccec034c13d34746a9e87149889d59ac767bFei Jiang            driver_data->output_method = PSB_PUTSURFACE_TEXTURE;
446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4482befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->drawable_info & (XVDRAWABLE_PIXMAP | XVDRAWABLE_REDIRECT_WINDOW))
4492befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_TEXTURE;
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (srcw >= destw * 8 || srch >= desth * 8)
452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->output_method = PSB_PUTSURFACE_TEXTURE;
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int psb__CheckGCXvImage(
4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VADriverContextP ctx,
4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VASurfaceID surface,
4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Drawable draw,
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XvImage **xvImage,
4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XvPortID *port_id,
4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int flags /* de-interlacing flags */
465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun)
4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
4682befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_surface_p obj_surface = SURFACE(surface); /* surface already checked */
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->output_drawable != draw) {
4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (output->gc)
473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XFreeGC((Display *)ctx->native_dpy, output->gc);
474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        output->gc = XCreateGC((Display *)ctx->native_dpy, draw, 0, NULL);
4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->output_drawable = draw;
4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (flags & VA_CLEAR_DRAWABLE) {
4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (output->textured_portID && (output->using_port == USING_TEXTURE_PORT)) {
480c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Clear drawable, and stop textured Xvideo\n");
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XvStopVideo((Display *)ctx->native_dpy, output->textured_portID, draw);
4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (output->overlay_portID && (output->using_port == USING_OVERLAY_PORT)) {
485c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Clear drawable, and stop overlay Xvideo\n");
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XvStopVideo((Display *)ctx->native_dpy, output->overlay_portID, draw);
4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->using_port = 0;
4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4912befccec034c13d34746a9e87149889d59ac767bFei Jiang        XSetForeground((Display *)ctx->native_dpy, output->gc, driver_data->clear_color);
492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_OVERLAY) ||
497bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (driver_data->output_method == PSB_PUTSURFACE_OVERLAY)) {
4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* use OVERLAY XVideo */
4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (obj_surface &&
500bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            ((output->output_width != obj_surface->width) ||
501bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang             (output->output_height != obj_surface->height) ||
502bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang             (!output->overlay_xvimage))) {
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (output->overlay_xvimage)
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                XFree(output->overlay_xvimage);
5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
507c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create new XvImage for overlay\n");
508437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            output->overlay_xvimage = XvCreateImage((Display *)ctx->native_dpy, output->overlay_portID,
5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                                    FOURCC_XVVA, 0,
5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                                    obj_surface->width, obj_surface->height);
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            output->overlay_xvimage->data = (char *) & output->imgdata_vasrf;
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            output->output_width = obj_surface->width;
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            output->output_height = obj_surface->height;
5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *xvImage = output->overlay_xvimage;
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *port_id = output->overlay_portID;
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if ((output->textured_portID) && (output->using_port == USING_TEXTURE_PORT)) { /* stop texture port */
520c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Using overlay xvideo, stop textured xvideo\n");
521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XvStopVideo((Display *)ctx->native_dpy, output->textured_portID, draw);
522437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XSync((Display *)ctx->native_dpy, False);
5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->using_port = USING_OVERLAY_PORT;
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
526c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Using Overlay Xvideo (%d) for PutSurface\n", output->textured_portID);
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXTURE) ||
532bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (driver_data->output_method == PSB_PUTSURFACE_TEXTURE)) {
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* use Textured XVideo */
534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_surface &&
535bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            ((output->output_width != obj_surface->width) ||
536bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang             (output->output_height != obj_surface->height ||
537bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang              (!output->textured_xvimage)))) {
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (output->textured_xvimage)
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                XFree(output->textured_xvimage);
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
541c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create new XvImage for overlay\n");
542437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            output->textured_xvimage = XvCreateImage((Display *)ctx->native_dpy, output->textured_portID, FOURCC_XVVA, 0,
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       obj_surface->width, obj_surface->height);
544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            output->textured_xvimage->data = (char *) & output->imgdata_vasrf;
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            output->output_width = obj_surface->width;
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            output->output_height = obj_surface->height;
547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *xvImage = output->textured_xvimage;
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *port_id = output->textured_portID;
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if ((output->overlay_portID) && (output->using_port == USING_OVERLAY_PORT)) { /* stop overlay port */
554c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Using textured xvideo, stop Overlay xvideo\n");
555437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XvStopVideo((Display *)ctx->native_dpy, output->overlay_portID, draw);
556437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            XSync((Display *)ctx->native_dpy, False);
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            output->using_port = USING_TEXTURE_PORT;
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
560dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
561c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Using Texture Xvideo (%d) for PutSurface\n", output->textured_portID);
562dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int psb_force_dpms_on(VADriverContextP ctx)
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    BOOL onoff;
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    CARD16 state;
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
574437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    DPMSInfo((Display *)ctx->native_dpy, &state, &onoff);
575c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "DPMS is %s, monitor state=%s\n", onoff ? "enabled" : "disabled",
576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             (state == DPMSModeOn) ? "on" : (
577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 (state == DPMSModeOff) ? "off" : (
578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     (state == DPMSModeStandby) ? "standby" : (
579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         (state == DPMSModeSuspend) ? "suspend" : "unknow"))));
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (onoff && (state != DPMSModeOn)) {
581c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "DPMS is enabled, and monitor isn't DPMSModeOn, force it on\n");
582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DPMSForceLevel((Display *)ctx->native_dpy, DPMSModeOn);
5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
584dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
588437b3eda28a4bf098efa80598cab67f190275266Fei JiangVAStatus psb_check_rotatesurface(
589437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
590437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short rotate_width,
591437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short rotate_height,
592437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int protected,
5932befccec034c13d34746a9e87149889d59ac767bFei Jiang    int fourcc
5942befccec034c13d34746a9e87149889d59ac767bFei Jiang)
5952befccec034c13d34746a9e87149889d59ac767bFei Jiang{
596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
5972befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_rotate_surface;
6004a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu    unsigned int flags = protected? IS_PROTECTED : 0;
601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (output->rotate_surface) {
603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface = SURFACE(output->rotate_surfaceID);
604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_rotate_surface &&
605bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            ((obj_rotate_surface->width != rotate_width)
606bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang             || (obj_rotate_surface->height != rotate_height))) {
607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_surface_destroy(output->rotate_surface);
608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            free(output->rotate_surface);
609437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            object_heap_free(&driver_data->surface_heap, (object_base_p)obj_rotate_surface);
610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            output->rotate_surface = NULL;
611437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
612437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
613437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (output->rotate_surface == NULL) {
614437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        output->rotate_surfaceID = object_heap_allocate(&driver_data->surface_heap);
615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface = SURFACE(output->rotate_surfaceID);
616437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (NULL == obj_rotate_surface) {
617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
618437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
620437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return VA_STATUS_ERROR_ALLOCATION_FAILED;
621437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
623437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface->surface_id = output->rotate_surfaceID;
624437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface->context_id = -1;
625437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface->width = rotate_width;
626437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface->height = rotate_height;
627437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface->subpictures = NULL;
628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        obj_rotate_surface->subpic_count = 0;
629437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface->derived_imgcnt = 0;
6302befccec034c13d34746a9e87149889d59ac767bFei Jiang        output->rotate_surface = (psb_surface_p) calloc(1, sizeof(struct psb_surface_s));
631437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (NULL == output->rotate_surface) {
632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            object_heap_free(&driver_data->surface_heap, (object_base_p) obj_rotate_surface);
633437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_rotate_surface->surface_id = VA_INVALID_SURFACE;
634437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
635437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
636437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
637437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
638437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return VA_STATUS_ERROR_ALLOCATION_FAILED;
640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
6412befccec034c13d34746a9e87149889d59ac767bFei Jiang
6424a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        flags |= IS_ROTATED;
643437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = psb_surface_create(driver_data, rotate_width, rotate_height,
6444a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu                                      fourcc, flags, output->rotate_surface);
645437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (VA_STATUS_SUCCESS != vaStatus) {
646437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            free(obj_rotate_surface->psb_surface);
647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            object_heap_free(&driver_data->surface_heap, (object_base_p) obj_rotate_surface);
648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_rotate_surface->surface_id = VA_INVALID_SURFACE;
649437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
651437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return vaStatus;
652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
653437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_rotate_surface->psb_surface = output->rotate_surface;
654437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
655437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
656437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_putsurface_xvideo(
6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VADriverContextP ctx,
6607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VASurfaceID surface,
6617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Drawable draw,
6627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short srcx,
6637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short srcy,
6647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short srcw,
6657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short srch,
6667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short destx,
6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    short desty,
6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short destw,
6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned short desth,
6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VARectangle *cliprects, /* client supplied clip list */
6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int flags /* de-interlacing flags */
673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun)
674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun{
6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_DRIVER_DATA;
6762befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    PsbVASurfaceRec *subpic_surface;
6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    PsbXvVAPutSurfacePtr vaPtr;
680bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    XvPortID    portID = 0;
6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    XvImage *xvImage = NULL;
6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_surface_p obj_surface = SURFACE(surface);
6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_surface_p psb_surface;
684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int i = 0, j;
6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
686437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (obj_surface) /* silent klockwork, we already check it */
6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_surface = obj_surface->psb_surface;
6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
6907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNKNOWN;
691437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6922befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* Catch X protocol errors with our own error handler */
6932befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (oldHandler == 0)
6942befccec034c13d34746a9e87149889d59ac767bFei Jiang        oldHandler = XSetErrorHandler(psb_XErrorHandler);
695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6962befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (XErrorFlag == 1) {
6972befccec034c13d34746a9e87149889d59ac767bFei Jiang        if (psb_CheckDrawable(ctx, draw) != 0) {
698c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "vaPutSurface: invalidate drawable\n");
6992befccec034c13d34746a9e87149889d59ac767bFei Jiang            return VA_STATUS_ERROR_UNKNOWN;
7002befccec034c13d34746a9e87149889d59ac767bFei Jiang        }
701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
702c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "ran psb_CheckDrawable the first time!\n");
703dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XErrorFlag = 0;
7042befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
706437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* check display configuration for every 100 frames */
7072befccec034c13d34746a9e87149889d59ac767bFei Jiang    if ((driver_data->frame_count % 100) == 0) {
708437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (psb_CheckDrawable(ctx, draw) != 0) {
709c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "vaPutSurface: invalidate drawable\n");
710437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return VA_STATUS_ERROR_UNKNOWN;
711437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
712c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "ran psb_CheckDrawable the first time!\n");
7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
715437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
716437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__CheckPutSurfaceXvPort(ctx, surface, draw,
7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                               srcx, srcy, srcw, srch,
7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                               destx, desty, destw, desth,
7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                               cliprects, number_cliprects, flags);
7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__CheckGCXvImage(ctx, surface, draw, &xvImage, &portID, flags);
7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (flags & VA_CLEAR_DRAWABLE) {
724c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Clean draw with color 0x%08x\n", driver_data->clear_color);
725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
726437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, destx, desty, destw, desth);
727437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XSync((Display *)ctx->native_dpy, False);
7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
729437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XFreeGC((Display *)ctx->native_dpy, output->gc);
7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->gc = NULL;
7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        output->output_drawable = 0;
732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
733437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        XSync((Display *)ctx->native_dpy, False);
7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        driver_data->cur_displaying_surface = VA_INVALID_SURFACE;
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        driver_data->last_displaying_surface = VA_INVALID_SURFACE;
7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_surface->display_timestamp = 0;
7387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
739dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
742dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaPtr = (PsbXvVAPutSurfacePtr)xvImage->data;
7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaPtr->flags = flags;
7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaPtr->num_subpicture = obj_surface->subpic_count;
7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaPtr->num_clipbox = number_cliprects;
747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (j = 0; j < number_cliprects; j++) {
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaPtr->clipbox[j].x = cliprects[j].x;
7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaPtr->clipbox[j].y = cliprects[j].y;
7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaPtr->clipbox[j].width = cliprects[j].width;
7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaPtr->clipbox[j].height = cliprects[j].height;
7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_surface_init(driver_data, &vaPtr->src_srf, VA_FOURCC_NV12, 2,
755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                     obj_surface->width, obj_surface->height,
7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                     psb_surface->stride, psb_surface->size,
7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                     psb_surface->buf.buffer_ofs, /* for surface created from RAR/camera device memory
7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                                   * all surfaces share one BO but with different offset
7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                                   * pass the offset as the "pre_add"
7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                                   */
7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                     psb_surface->buf.drm_buf, flags);
7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((driver_data->output_method == PSB_PUTSURFACE_OVERLAY)
764bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        && (driver_data->drawable_info & (XVDRAWABLE_ROTATE_180 | XVDRAWABLE_ROTATE_90 | XVDRAWABLE_ROTATE_270))) {
7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        unsigned int rotate_width, rotate_height;
766437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        int fourcc;
767437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (output->sprite_enabled)
768437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            fourcc = VA_FOURCC_RGBA;
769437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        else
770437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            fourcc = VA_FOURCC_NV12;
7712befccec034c13d34746a9e87149889d59ac767bFei Jiang        if (driver_data->drawable_info & (XVDRAWABLE_ROTATE_90 | XVDRAWABLE_ROTATE_270)) {
7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            rotate_width = obj_surface->height;
7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            rotate_height = obj_surface->width;
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        } else {
7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            rotate_width = obj_surface->width;
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            rotate_height = obj_surface->height;
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
778fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        unsigned int protected = vaPtr->src_srf.pl_flags & 0;
779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
780dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_check_rotatesurface(ctx, rotate_width, rotate_height, protected, fourcc);
781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VA_STATUS_SUCCESS != vaStatus)
782dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return vaStatus;
783437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
784437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_surface_init(driver_data, &vaPtr->dst_srf, fourcc, 4,
785dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         rotate_width, rotate_height,
786dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         output->rotate_surface->stride, output->rotate_surface->size,
787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         output->rotate_surface->buf.buffer_ofs, /* for surface created from RAR/camera device memory
788437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                                          * all surfaces share one BO but with different offset
789437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                                          * pass the offset as the "pre_add"
790437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                                          */
791dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         output->rotate_surface->buf.drm_buf, 0);
7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    subpic_surface = obj_surface->subpictures;
7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while (subpic_surface) {
7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        PsbVASurfaceRec *tmp = &vaPtr->subpic_srf[i++];
796dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        memcpy(tmp, subpic_surface, sizeof(*tmp));
7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* reload palette for paletted subpicture
8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * palete_ptr point to image palette
8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (subpic_surface->palette_ptr)
8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            memcpy(&tmp->palette[0], subpic_surface->palette_ptr, 16 * sizeof(PsbAYUVSample8));
804dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
805437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        subpic_surface = subpic_surface->next;
8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (output->ignore_dpm == 0)
8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_force_dpms_on(ctx);
810dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
811437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    XvPutImage((Display *)ctx->native_dpy, portID, draw, output->gc, xvImage,
812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               srcx, srcy, srcw, srch, destx, desty, destw, desth);
8132befccec034c13d34746a9e87149889d59ac767bFei Jiang    XFlush((Display *)ctx->native_dpy);
8142befccec034c13d34746a9e87149889d59ac767bFei Jiang    //XSync((Display *)ctx->native_dpy, False);
8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (portID == output->overlay_portID) {
817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (driver_data->cur_displaying_surface != VA_INVALID_SURFACE)
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            driver_data->last_displaying_surface = driver_data->cur_displaying_surface;
8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_surface->display_timestamp = GetTickCount();
8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        driver_data->cur_displaying_surface = surface;
8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } else {
8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        driver_data->cur_displaying_surface = VA_INVALID_SURFACE;
8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        driver_data->last_displaying_surface = VA_INVALID_SURFACE;
8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_surface->display_timestamp = 0;
8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
826dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
830437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
831