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, ¤t_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