10e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 30e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei 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 * Jason Hu <jason.hu@intel.com> 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Zhaohan Ren <zhaohan.ren@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Shengquan Yuan <shengquan.yuan@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 310e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <X11/Xutil.h> 320e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <X11/extensions/Xrandr.h> 330e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <va/va_backend.h> 340e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_output.h" 350e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_surface.h" 360e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_buffer.h" 370e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_x11.h" 38f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h" 390e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 400e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <stdio.h> 410e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <string.h> 420e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <stdarg.h> 430e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include "psb_surface_ext.h" 440e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#include <wsbm/wsbm_manager.h> 452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "psb_drv_video.h" 462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "psb_xrandr.h" 472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include <sys/types.h> 480e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 490e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData 500e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define INIT_OUTPUT_PRIV psb_x11_output_p output = (psb_x11_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv) 51bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) 520e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic int 540e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiangpsb_x11_getWindowCoordinate(Display * display, 550e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang Window x11_window_id, 560e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_win_t * psX11Window, 570e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang int * pbIsVisible) 580e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{ 590e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang Window DummyWindow; 600e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang Status status; 610e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang XWindowAttributes sXWinAttrib; 62dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 630e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang if ((status = XGetWindowAttributes(display, 64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_id, 65dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &sXWinAttrib)) == 0) { 66c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to get X11 window coordinates - error %lu\n", __func__, (unsigned long)status); 670e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return -1; 680e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 690e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 700e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psX11Window->i32Left = sXWinAttrib.x; 710e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psX11Window->i32Top = sXWinAttrib.y; 720e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psX11Window->ui32Width = sXWinAttrib.width; 730e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psX11Window->ui32Height = sXWinAttrib.height; 740e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang *pbIsVisible = (sXWinAttrib.map_state == IsViewable); 75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 760e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang if (!*pbIsVisible) 77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 0; 780e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 790e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang if (XTranslateCoordinates(display, 80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_id, 81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DefaultRootWindow(display), 82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &psX11Window->i32Left, 85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &psX11Window->i32Top, 86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &DummyWindow) == 0) { 87c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to tranlate X coordinates - error %lu\n", __func__, (unsigned long)status); 880e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return -1; 890e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 900e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 910e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psX11Window->i32Right = psX11Window->i32Left + psX11Window->ui32Width - 1; 92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psX11Window->i32Bottom = psX11Window->i32Top + psX11Window->ui32Height - 1; 930e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 0; 950e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang} 960e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiangstatic psb_x11_clip_list_t * 970e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiangpsb_x11_createClipBoxNode(psb_x11_win_t * pRect, 980e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_clip_list_t * pClipNext) 990e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{ 1000e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_clip_list_t * pCurrent = NULL; 101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1020e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang pCurrent = (psb_x11_clip_list_t *)calloc(1, sizeof(psb_x11_clip_list_t)); 1030e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang if (pCurrent) { 1040e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang pCurrent->rect = *pRect; 1050e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang pCurrent->next = pClipNext; 1060e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1070e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return pCurrent; 1080e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } else 1090e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return pClipNext; 1100e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang} 1110e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid 1130e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiangpsb_x11_freeWindowClipBoxList(psb_x11_clip_list_t * pHead) 1140e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{ 1150e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_clip_list_t * pNext = NULL; 1160e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1170e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang while (pHead) { 1180e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang pNext = pHead->next; 1190e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang free(pHead); 1200e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang pHead = pNext; 1210e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 1220e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang} 1230e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1240e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang#define IS_BETWEEN_RANGE(a,b,c) ((a<=b)&&(b<=c)) 1250e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1260e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiangstatic psb_x11_clip_list_t * 1270e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiangpsb_x11_substractRects(Display * display, 1280e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_clip_list_t * psRegion, 1290e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_win_t * psRect) 1300e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{ 131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_x11_clip_list_t * psCur, * psPrev, * psFirst, * psNext; 1320e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_win_t sCreateRect; 1330e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang int display_width = (int)(DisplayWidth(display, DefaultScreen(display))) - 1; 1340e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang int display_height = (int)(DisplayHeight(display, DefaultScreen(display))) - 1; 1350e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psFirst = psb_x11_createClipBoxNode(psRect, NULL); 137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psFirst->rect.i32Left < 0) 1390e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Left = 0; 140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (psFirst->rect.i32Left > display_width) 1410e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Left = display_width; 142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psFirst->rect.i32Right < 0) 1440e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Right = 0; 145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (psFirst->rect.i32Right > display_width) 1460e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Right = display_width; 1470e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psFirst->rect.i32Top < 0) 1490e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Top = 0; 150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (psFirst->rect.i32Top > display_height) 1510e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Top = display_height; 152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psFirst->rect.i32Bottom < 0) 1540e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Bottom = 0; 155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (psFirst->rect.i32Bottom > display_height) 1560e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst->rect.i32Bottom = display_height; 157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (psRegion) { 1590e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psCur = psFirst; 1600e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psPrev = NULL; 161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (psCur) { 1630e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psNext = psCur->next; 164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((psRegion->rect.i32Left > psCur->rect.i32Left) && 166bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (psRegion->rect.i32Left <= psCur->rect.i32Right)) { 167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCreateRect.i32Right = psRegion->rect.i32Left - 1; 168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCreateRect.i32Left = psCur->rect.i32Left; 170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCreateRect.i32Top = psCur->rect.i32Top; 171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCreateRect.i32Bottom = psCur->rect.i32Bottom; 172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1730e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst = psb_x11_createClipBoxNode(&sCreateRect, psFirst); 174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!psPrev) 176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psPrev = psFirst; 177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1780e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psCur->rect.i32Left = psRegion->rect.i32Left; 1790e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((psRegion->rect.i32Right >= psCur->rect.i32Left) && 182bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (psRegion->rect.i32Right < psCur->rect.i32Right)) 183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1840e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang { 185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sCreateRect.i32Left = psRegion->rect.i32Right + 1; 186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1870e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Right = psCur->rect.i32Right; 1880e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Top = psCur->rect.i32Top; 1890e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Bottom = psCur->rect.i32Bottom; 190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1910e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst = psb_x11_createClipBoxNode(&sCreateRect, psFirst); 192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!psPrev) 1940e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psPrev = psFirst; 195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1960e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psCur->rect.i32Right = psRegion->rect.i32Right; 1970e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((psRegion->rect.i32Top > psCur->rect.i32Top) && 200bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (psRegion->rect.i32Top <= psCur->rect.i32Bottom)) { 2010e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Bottom = psRegion->rect.i32Top - 1; 202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2030e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Left = psCur->rect.i32Left; 2040e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Right = psCur->rect.i32Right; 2050e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Top = psCur->rect.i32Top; 206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2070e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst = psb_x11_createClipBoxNode(&sCreateRect, psFirst); 208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!psPrev) 2100e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psPrev = psFirst; 211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2120e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psCur->rect.i32Top = psRegion->rect.i32Top; 2130e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((psRegion->rect.i32Bottom >= psCur->rect.i32Top) && 216bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (psRegion->rect.i32Bottom < psCur->rect.i32Bottom)) { 2170e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Top = psRegion->rect.i32Bottom + 1; 2180e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Left = psCur->rect.i32Left; 2190e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Right = psCur->rect.i32Right; 2200e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang sCreateRect.i32Bottom = psCur->rect.i32Bottom; 221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2220e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst = psb_x11_createClipBoxNode(&sCreateRect, psFirst); 223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!psPrev) 2250e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psPrev = psFirst; 226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2270e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psCur->rect.i32Bottom = psRegion->rect.i32Bottom; 2280e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((IS_BETWEEN_RANGE(psRegion->rect.i32Left, psCur->rect.i32Left, psRegion->rect.i32Right)) && 231bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (IS_BETWEEN_RANGE(psRegion->rect.i32Left, psCur->rect.i32Right, psRegion->rect.i32Right)) && 232bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (IS_BETWEEN_RANGE(psRegion->rect.i32Top, psCur->rect.i32Top, psRegion->rect.i32Bottom)) && 233bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (IS_BETWEEN_RANGE(psRegion->rect.i32Top, psCur->rect.i32Bottom, psRegion->rect.i32Bottom))) { 234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psPrev) { 2350e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psPrev->next = psCur->next; 2360e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang free(psCur); 2370e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psCur = psPrev; 2380e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } else { 2390e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang free(psCur); 240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psCur = NULL; 2410e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psFirst = psNext; 2420e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 2430e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 2440e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psPrev = psCur; 2450e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psCur = psNext; 2460e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang }//while(psCur) 2470e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psRegion = psRegion->next; 2480e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang }//while(psRegion) 2490e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 2500e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return psFirst; 2510e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang} 252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 253dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic int 2540e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiangpsb_x11_createWindowClipBoxList(Display * display, 255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun Window x11_window_id, 256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_x11_clip_list_t ** ppWindowClipBoxList, 257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int * pui32NumClipBoxList) 2580e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{ 259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun Window CurrentWindow = x11_window_id; 2600e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang Window RootWindow, ParentWindow, ChildWindow; 2610e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang Window * pChildWindow; 2620e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang Status XResult; 2630e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned int i32NumChildren, i; 2640e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang int bIsVisible; 2650e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned int ui32NumRects = 0; 2660e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_clip_list_t *psRegions = NULL; 2670e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_win_t sRect; 268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!display || (!ppWindowClipBoxList) || (!pui32NumClipBoxList)) 2700e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return -1; 2710e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 2720e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang XResult = XQueryTree(display, 273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun CurrentWindow, 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &RootWindow, 275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &ParentWindow, 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &pChildWindow, 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &i32NumChildren); 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (XResult == 0) 2790e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return -2; 2800e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i32NumChildren) { 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < i32NumChildren; i++) { 283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_x11_getWindowCoordinate(display, x11_window_id, &sRect, &bIsVisible); 285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (bIsVisible) { 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psRegions = psb_x11_createClipBoxNode(&sRect, psRegions); 2870e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang ui32NumRects++; 2880e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 2890e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 2900e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang XFree(pChildWindow); 2910e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang i32NumChildren = 0; 2920e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 2930e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (CurrentWindow != RootWindow) { 2950e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang ChildWindow = CurrentWindow; 2960e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang CurrentWindow = ParentWindow; 2970e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 2980e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang XResult = XQueryTree(display, 2990e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang CurrentWindow, 3000e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang &RootWindow, 3010e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang &ParentWindow, 3020e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang &pChildWindow, 3030e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang &i32NumChildren); 304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (XResult == 0) { 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i32NumChildren) 3060e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang XFree(pChildWindow); 3070e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 3080e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_freeWindowClipBoxList(psRegions); 3090e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return -3; 3100e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i32NumChildren) { 3130e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned int iStartWindow = 0; 3140e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < i32NumChildren; i++) { 316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pChildWindow[i] == ChildWindow) { 3170e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang iStartWindow = i; 3180e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang break; 3190e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3200e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3210e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i == i32NumChildren) { 3230e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang XFree(pChildWindow); 3240e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_freeWindowClipBoxList(psRegions); 3250e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return -4; 3260e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3270e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = iStartWindow + 1; i < i32NumChildren; i++) { 3290e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_getWindowCoordinate(display, pChildWindow[i], &sRect, &bIsVisible); 330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (bIsVisible) { 3310e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psRegions = psb_x11_createClipBoxNode(&sRect, psRegions); 3320e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang ui32NumRects++; 3330e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3340e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3350e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 3360e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang XFree(pChildWindow); 3370e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3380e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3390e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 3400e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang ui32NumRects = 0; 3410e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psRegions) { 343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_x11_getWindowCoordinate(display, x11_window_id, &sRect, &bIsVisible); 3440e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang *ppWindowClipBoxList = psb_x11_substractRects(display, psRegions, &sRect); 3450e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_x11_freeWindowClipBoxList(psRegions); 346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3470e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psRegions = *ppWindowClipBoxList; 348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (psRegions) { 3500e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang ui32NumRects++; 3510e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psRegions = psRegions->next; 3520e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 3540e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang *ppWindowClipBoxList = psb_x11_substractRects(display, NULL, &sRect); 3550e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang ui32NumRects = 1; 3560e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 3570e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 3580e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang *pui32NumClipBoxList = ui32NumRects; 3590e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 0; 3610e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang} 3620e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 3634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic int psb_cleardrawable_stopoverlay( 3644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo VADriverContextP ctx, 3654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo Drawable draw, /* X Drawable */ 3664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo short destx, 3674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo short desty, 3684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned short destw, 3694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned short desth 3704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo) 3714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 3724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 3734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_OUTPUT_PRIV; 374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, destx, desty, destw, desth); 3764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->cur_displaying_surface = VA_INVALID_SURFACE; 3794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->last_displaying_surface = VA_INVALID_SURFACE; 3804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 3814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return 0; 3824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 3834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 3842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangstatic VAStatus psb_DisplayRGBASubpicture( 385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbVASurfaceRec *subpicture, 386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADriverContextP ctx, 387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int win_width, 388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int win_height, 389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int surface_x, 390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int surface_y, 391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int surface_w, 392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int surface_h, 393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_extvideo_subtitle subtitle 3942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang) 3952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 3962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang INIT_DRIVER_DATA; 3974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_OUTPUT_PRIV; 3982f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang XImage *ximg = NULL; 3992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang Visual *visual; 4002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang PsbPortPrivRec *pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 4012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang struct _WsbmBufferObject *bo = subpicture->bo; 4022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int image_width, image_height, width, height, size; 4032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int srcx, srcy, srcw, srch; 4042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int destx, desty, destw, desth; 4054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int depth, i; 4062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (subpicture->fourcc != VA_FOURCC_RGBA) { 408c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Invalid image format, ONLY support RGBA subpicture now.\n", __func__); 409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT; 4102f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 4112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo for (i = 0; subpicture != NULL; subpicture = subpicture->next, i++) { 4134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcx = subpicture->subpic_srcx; 4144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcy = subpicture->subpic_srcy; 4154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcw = subpicture->subpic_srcw; 4164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srch = subpicture->subpic_srch; 4174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destx = subpicture->subpic_dstx + surface_x; 4194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desty = subpicture->subpic_dsty + surface_y; 4204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destw = subpicture->subpic_dstw; 4214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desth = subpicture->subpic_dsth; 4224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo image_width = subpicture->width; 4244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo image_height = subpicture->height; 4254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo size = subpicture->size; 4264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo //clip in image region 4284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (srcx < 0) { 4294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcw += srcx; 4304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcx = 0; 4314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (srcy < 0) { 4344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srch += srcy; 4354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcy = 0; 4364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((srcx + srcw) > image_width) 4394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcw = image_width - srcx; 4404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((srcy + srch) > image_height) 441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun srch = image_height - srcy; 4422f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 4434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo //clip in drawable region 4444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (destx < 0) { 4454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destw += destx; 4464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destx = 0; 4474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (desty < 0) { 4504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desth += desty; 4514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desty = 0; 4524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((destx + destw) > surface_w) 4554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destw = surface_w - destx; 4564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((desty + desth) > surface_h) 4574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desth = surface_h - desty; 4584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (srcw <= destw) 4604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo width = srcw; 4614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 4624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo width = destw; 4634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (srch <= desth) 4654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo height = srch; 4664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 4674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo height = desth; 4684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo visual = DefaultVisual(ctx->native_dpy, 0); 4704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo depth = DefaultDepth(ctx->native_dpy, 0); 4714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ximg = XCreateImage(ctx->native_dpy, visual, depth, ZPixmap, 0, NULL, image_width, image_height, 32, 0); 4734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == ximg) { 475c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: XCreateImage failed! at L%d\n", __func__, __LINE__); 4764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_ERROR_UNKNOWN; 4774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ximg->data = wsbmBOMap(bo, WSBM_ACCESS_READ); 4804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (NULL == ximg->data) { 481c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to map to ximg->data.\n", __func__); 4824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_ERROR_ALLOCATION_FAILED; 4834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->clear_key[i].subpic_dstx = destx; 4864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->clear_key[i].subpic_dsty = desty; 4874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->clear_key[i].subpic_dstw = destw; 4884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->clear_key[i].subpic_dsth = desth; 4894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_extvideo_mode()) { 4904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*It is a HACK: Adjust subtitle to proper position.*/ 4914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo float xScale, yScale; 4924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 4934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo xScale = win_width * 1.0 / surface_w; 4944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo yScale = win_height * 1.0 / surface_h; 4954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destx = subpicture->subpic_dstx * xScale; 4964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desty = subpicture->subpic_dsty * yScale; 4974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XPutImage(ctx->native_dpy, output->output_drawable, output->gc, ximg, srcx, srcy, destx, desty, width, height); 4994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 5004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 5014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_extvideo_mode() && 502bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (subtitle == ONLY_HDMI || subtitle == BOTH)) { 5034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo float xScale, yScale; 5044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 5054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo xScale = pPriv->extend_display_width * 1.0 / surface_w; 5064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo yScale = pPriv->extend_display_height * 1.0 / surface_h; 5074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 5084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destx = subpicture->subpic_dstx * xScale; 5094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desty = subpicture->subpic_dsty * yScale; 5104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 5114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XPutImage(ctx->native_dpy, output->extend_drawable, output->extend_gc, ximg, 512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun srcx, srcy, destx, desty, destw, desth); 5134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 5144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 5154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 5164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->subpic_clear_flag = 0; 5174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ximg->data = NULL; 5184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo wsbmBOUnmap(bo); 5194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (NULL != ximg) 5204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XDestroyImage(ximg); 5212f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 5224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_SUCCESS; 5234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 5242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 5254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus psb_repaint_colorkey( 526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADriverContextP ctx, 527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun Drawable draw, /* X Drawable */ 528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VASurfaceID surface, 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int x11_window_width, 530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int x11_window_height 5314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo) 5324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 5334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 5344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_OUTPUT_PRIV; 535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i, ret; 536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_x11_clip_list_t *pClipNext = NULL; 5374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo VARectangle *pVaWindowClipRects = NULL; 5384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo object_surface_p obj_surface = SURFACE(surface); 5394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbPortPrivRec *pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 5402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (output->frame_count % 500 == 0 || driver_data->xrandr_update) { 542c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Repaint color key.\n"); 543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (output->pClipBoxList) 544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_x11_freeWindowClipBoxList(output->pClipBoxList); 545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* get window clipbox */ 546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_x11_createWindowClipBoxList(ctx->native_dpy, draw, &output->pClipBoxList, &output->ui32NumClipBoxList); 547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret != 0) { 548c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: get window clip boxes error # %d\n", __func__, ret); 549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (output->frame_count == 500) 552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output->frame_count = 0; 553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->xrandr_update = 0; 5554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 5562f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pVaWindowClipRects = (VARectangle *)calloc(1, sizeof(VARectangle) * output->ui32NumClipBoxList); 5584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!pVaWindowClipRects) { 559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_x11_freeWindowClipBoxList(output->pClipBoxList); 5602f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 5612f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 562dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(pVaWindowClipRects, 0, sizeof(VARectangle)*output->ui32NumClipBoxList); 564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pClipNext = output->pClipBoxList; 565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#ifdef CLIP_DEBUG 566c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Total %d clip boxes\n", __func__, output->ui32NumClipBoxList); 5674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < output->ui32NumClipBoxList; i++) { 569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pVaWindowClipRects[i].x = pClipNext->rect.i32Left; 5704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pVaWindowClipRects[i].y = pClipNext->rect.i32Top; 5714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pVaWindowClipRects[i].width = pClipNext->rect.i32Right - pClipNext->rect.i32Left; 5724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pVaWindowClipRects[i].height = pClipNext->rect.i32Bottom - pClipNext->rect.i32Top; 5734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#ifdef CLIP_DEBUG 574c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: clip boxes Left Top (%d, %d) Right Bottom (%d, %d) width %d height %d\n", __func__, 5754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pClipNext->rect.i32Left, pClipNext->rect.i32Top, 5764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pClipNext->rect.i32Right, pClipNext->rect.i32Bottom, 5774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pVaWindowClipRects[i].width, pVaWindowClipRects[i].height); 5784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 5794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pClipNext = pClipNext->next; 5804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* repaint the color key when window size changed*/ 5834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!obj_surface->subpictures && 584bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((pPriv->x11_window_width != x11_window_width) || 585bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (pPriv->x11_window_height != x11_window_height))) { 5864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->x11_window_width = x11_window_width; 5874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->x11_window_height = x11_window_height; 5884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSetForeground((Display *)ctx->native_dpy, output->gc, pPriv->colorKey); 5894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, 0, 0, x11_window_width, x11_window_height); 5904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 5914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 5924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((!obj_surface->subpictures) && 595bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((output->ui32NumClipBoxList != pPriv->last_num_clipbox) || 596bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (memcmp(&pVaWindowClipRects[0], &(pPriv->last_clipbox[0]), (output->ui32NumClipBoxList > 16 ? 16 : output->ui32NumClipBoxList)*sizeof(VARectangle)) != 0))) { 597dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pPriv->last_num_clipbox = output->ui32NumClipBoxList; 598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(&pPriv->last_clipbox[0], &pVaWindowClipRects[0], (output->ui32NumClipBoxList > 16 ? 16 : output->ui32NumClipBoxList)*sizeof(VARectangle)); 5994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, 0, 0, x11_window_width, x11_window_height); 6004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 6014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo free(pVaWindowClipRects); 6044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_SUCCESS; 6064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 6074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus psb_extendMode_getCoordinate( 609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbPortPrivPtr pPriv, 610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_location extend_location, 611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun short destx, 612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun short desty, 613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun short srcx, 614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun short srcy, 615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun float xScaleFactor, 616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun float yScaleFactor, 617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int *x11_window_width, 618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int *x11_window_height, 619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_overlay_rect_p local_rect, 620dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_overlay_rect_p extend_rect, 621dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun enum overlay_id_t *extend_overlay 6224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo) 6234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 6244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo switch (extend_location) { 625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case LEFT_OF: 626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + *x11_window_width) > (pPriv->display_width + pPriv->extend_display_width)) { 627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *x11_window_width = pPriv->display_width + pPriv->extend_display_width - destx; 628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((desty + *x11_window_height) < pPriv->display_height) && 630bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((desty + *x11_window_height) < pPriv->extend_display_height)) 631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = extend_rect->dHeight = *x11_window_height; 632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (pPriv->display_height < pPriv->extend_display_height) { 633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = pPriv->display_height - desty; 634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + *x11_window_height) > pPriv->extend_display_height) 635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = *x11_window_height = pPriv->extend_display_height - desty; 636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = *x11_window_height; 638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = pPriv->extend_display_height - desty; 640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + *x11_window_height) > pPriv->display_height) 641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = *x11_window_height = pPriv->display_height - desty; 642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = *x11_window_height; 644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 645dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx < pPriv->extend_display_width) && ((destx + *x11_window_width) < pPriv->extend_display_width)) { 647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = 0; 648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = *x11_window_width; 649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *extend_overlay = OVERLAY_A; 650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->destx = 0; 651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if ((destx < pPriv->extend_display_width) && ((destx + *x11_window_width) >= pPriv->extend_display_width)) { 652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = pPriv->extend_display_width - destx; 653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = *x11_window_width - extend_rect->dWidth; 654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->destx = 0; 655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = *x11_window_width; 657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = 0; 658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->destx = destx - pPriv->extend_display_width; 659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sWidth = (unsigned short)(local_rect->dWidth * xScaleFactor); 661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sHeight = (unsigned short)(local_rect->dHeight * yScaleFactor); 662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sWidth = (unsigned short)(extend_rect->dWidth * xScaleFactor); 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sHeight = (unsigned short)(extend_rect->dHeight * yScaleFactor); 664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcx = srcx + extend_rect->sWidth; 666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->srcx = srcx; 667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcy = extend_rect->srcy = srcy; 668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->destx = destx; 670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->desty = extend_rect->desty = desty; 671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case RIGHT_OF: 673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + *x11_window_width) > (pPriv->display_width + pPriv->extend_display_width)) { 674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *x11_window_width = pPriv->display_width + pPriv->extend_display_width - destx; 675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((desty + *x11_window_height) < pPriv->display_height) && 677bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((desty + *x11_window_height) < pPriv->extend_display_height)) 678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = extend_rect->dHeight = *x11_window_height; 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (pPriv->display_height < pPriv->extend_display_height) { 680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = pPriv->display_height - desty; 681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + *x11_window_height) > pPriv->extend_display_height) 682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = *x11_window_height = pPriv->extend_display_height - desty; 683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = *x11_window_height; 685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = pPriv->extend_display_height - desty; 687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + *x11_window_height) > pPriv->display_height) 688dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = *x11_window_height = pPriv->display_height - desty; 689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = *x11_window_height; 691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 6924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx < pPriv->display_width) && ((destx + *x11_window_width) < pPriv->display_width)) { 694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = *x11_window_width; 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = 0; 696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->destx = 0; 697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if ((destx < pPriv->display_width) && ((destx + *x11_window_width) >= pPriv->display_width)) { 698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = pPriv->display_width - destx; 699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = *x11_window_width - local_rect->dWidth; 700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->destx = 0; 701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 702dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = 0; 703dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = *x11_window_width; 704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *extend_overlay = OVERLAY_A; 705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->destx = destx - pPriv->display_width; 706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sWidth = (unsigned short)(local_rect->dWidth * xScaleFactor); 708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sHeight = (unsigned short)(local_rect->dHeight * yScaleFactor); 709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sWidth = (unsigned short)(extend_rect->dWidth * xScaleFactor); 710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sHeight = (unsigned short)(extend_rect->dHeight * yScaleFactor); 711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcx = srcx; 713dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->srcx = srcx + local_rect->sWidth; 714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcy = extend_rect->srcy = srcy; 715dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->destx = destx; 717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->desty = extend_rect->desty = desty; 718dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case ABOVE: 720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((destx + *x11_window_width) < pPriv->display_width) && 721bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((destx + *x11_window_width) < pPriv->extend_display_width)) 722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = extend_rect->dWidth = *x11_window_width; 723dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (pPriv->display_width < pPriv->extend_display_width) { 724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = pPriv->display_width - destx; 725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + *x11_window_width) > pPriv->extend_display_width) 726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = *x11_window_width = pPriv->extend_display_width - destx; 727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 7284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect->dWidth = *x11_window_width; 729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = pPriv->extend_display_width - destx; 731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + *x11_window_width) > pPriv->display_width) 732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = *x11_window_width = pPriv->display_width - destx; 733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 7344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect->dWidth = *x11_window_width; 735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 7364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + *x11_window_height) > (pPriv->display_height + pPriv->extend_display_height)) { 738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *x11_window_height = pPriv->display_height + pPriv->extend_display_height - desty; 739dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 7404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty < pPriv->extend_display_height) && ((desty + *x11_window_height) < pPriv->extend_display_height)) { 742dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = 0; 743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = *x11_window_height; 744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *extend_overlay = OVERLAY_A; 745dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->desty = 0; 746dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if ((desty < pPriv->extend_display_height) && ((desty + *x11_window_height) >= pPriv->extend_display_height)) { 747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = pPriv->extend_display_height - desty; 748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = *x11_window_height - extend_rect->dHeight; 749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->desty = 0; 750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = *x11_window_height; 752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = 0; 753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->desty = desty - pPriv->extend_display_height; 754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sWidth = (unsigned short)(local_rect->dWidth * xScaleFactor); 756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sHeight = (unsigned short)(local_rect->dHeight * yScaleFactor); 757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sWidth = (unsigned short)(extend_rect->dWidth * xScaleFactor); 758dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sHeight = (unsigned short)(extend_rect->dHeight * yScaleFactor); 759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 760dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcy = srcy + extend_rect->sHeight; 761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->srcy = srcy; 762dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcx = extend_rect->srcx = srcx; 763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->desty = desty; 765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->destx = extend_rect->destx = destx; 766dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 767dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case BELOW: 768dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((destx + *x11_window_width) < pPriv->display_width) && 769bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((destx + *x11_window_width) < pPriv->extend_display_width)) 770dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = extend_rect->dWidth = *x11_window_width; 771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (pPriv->display_width < pPriv->extend_display_width) { 772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = pPriv->display_width - destx; 773dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + *x11_window_width) > pPriv->extend_display_width) 774dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = *x11_window_width = pPriv->extend_display_width - destx; 775dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 776dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = *x11_window_width; 777dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dWidth = pPriv->extend_display_width - destx; 779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + *x11_window_width) > pPriv->display_width) 780dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = *x11_window_width = pPriv->display_width - destx; 781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 782dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dWidth = *x11_window_width; 783dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 7844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 785dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + *x11_window_height) > (pPriv->display_height + pPriv->extend_display_height)) { 786dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *x11_window_height = pPriv->display_height + pPriv->extend_display_height - desty; 787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 7884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 789dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty < pPriv->display_height) && ((desty + *x11_window_height) < pPriv->display_height)) { 790dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = *x11_window_height; 791dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = 0; 792dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->desty = 0; 793dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if ((desty < pPriv->display_height) && ((desty + *x11_window_height) >= pPriv->display_height)) { 794dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = pPriv->display_height - desty; 795dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = *x11_window_height - local_rect->dHeight; 796dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->desty = 0; 797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->dHeight = 0; 799dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->dHeight = *x11_window_height; 800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *extend_overlay = OVERLAY_A; 801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->desty = desty - pPriv->display_height; 802dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sWidth = (unsigned short)(local_rect->dWidth * xScaleFactor); 804dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->sHeight = (unsigned short)(local_rect->dHeight * yScaleFactor); 805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sWidth = (unsigned short)(extend_rect->dWidth * xScaleFactor); 806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->sHeight = (unsigned short)(extend_rect->dHeight * yScaleFactor); 807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcy = srcy; 809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect->srcy = srcy + local_rect->sHeight; 810dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->srcx = extend_rect->srcx = srcx; 811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->desty = desty; 813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect->destx = extend_rect->destx = destx; 814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case NORMAL: 816dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 8184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 8194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_SUCCESS; 8204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 8214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_init_subpicture(VADriverContextP ctx, PsbPortPrivPtr pPriv) 8234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 8244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 8254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo struct drm_psb_register_rw_arg regs; 8264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned int subpicture_enable_mask = REGRWBITS_DSPACNTR; 8274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!pPriv->subpicture_enabled) { 8294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_hdmi_enabled()) 8302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang subpicture_enable_mask |= REGRWBITS_DSPBCNTR; 8314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_mipi1_enabled()) 8324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo subpicture_enable_mask |= REGRWBITS_DSPCCNTR; 8334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang memset(®s, 0, sizeof(regs)); 8354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo regs.subpicture_enable_mask = subpicture_enable_mask; 8364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->subpicture_enable_mask = subpicture_enable_mask; 8372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pPriv->subpicture_enabled = 1; 8384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo drmCommandWriteRead(driver_data->drm_fd, DRM_PSB_REGISTER_RW, ®s, sizeof(regs)); 8392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 8402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 8412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_clear_subpictures( 8430e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang VADriverContextP ctx, 8444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbPortPrivPtr pPriv, 8454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int win_width, 8464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int win_height, 8474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo object_surface_p obj_surface 8480e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang) 8490e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{ 8500e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang INIT_OUTPUT_PRIV; 8514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbVASurfaceRec *subpicture = (PsbVASurfaceRec *)obj_surface->subpictures; 8524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int i; 8530e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 8544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (subpicture == NULL) { 855c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Surface has no subpicture to render.\n"); 8564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return; 8574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 8582f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo for (i = 0; subpicture != NULL; subpicture = subpicture->next, i++) { 8604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((subpicture->subpic_dstx != pPriv->clear_key[i].subpic_dstx) || 861bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (subpicture->subpic_dsty != pPriv->clear_key[i].subpic_dsty) || 862bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (subpicture->subpic_dstw != pPriv->clear_key[i].subpic_dstw) || 863bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (subpicture->subpic_dsth != pPriv->clear_key[i].subpic_dsth)) { 8644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSetForeground((Display *)ctx->native_dpy, output->gc, 0); 8654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFillRectangle((Display *)ctx->native_dpy, output->output_drawable, output->gc, 0, 0, win_width, win_height); 8664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 8674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_extvideo_mode()) { 8684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSetForeground((Display *)ctx->native_dpy, output->extend_gc, 0); 8694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFillRectangle((Display *)ctx->native_dpy, output->extend_drawable, output->extend_gc, 870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 0, pPriv->extend_display_width, pPriv->extend_display_height); 8714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 8724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 8734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pPriv->subpic_clear_flag = 1; 8744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 8754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 8764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return; 8770e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang} 8780e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 8790e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei JiangVAStatus psb_putsurface_coverlay( 8800e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang VADriverContextP ctx, 8810e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang VASurfaceID surface, 8820e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang Drawable draw, /* X Drawable */ 8830e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang short srcx, 8840e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang short srcy, 8850e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned short srcw, 8860e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned short srch, 8870e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang short destx, 8880e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang short desty, 8890e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned short destw, 8900e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned short desth, 8910e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang VARectangle *cliprects, /* client supplied clip list */ 8920e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned int number_cliprects, /* number of clip rects in the clip list */ 8930e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang unsigned int flags /* de-interlacing flags */ 8940e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang) 8950e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang{ 8960e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang INIT_DRIVER_DATA; 8970e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang INIT_OUTPUT_PRIV; 8984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int ret; 8992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int x11_window_width = destw, x11_window_height = desth; 9002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang psb_xrandr_location extend_location; 9012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang object_surface_p obj_surface = SURFACE(surface); 9022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang PsbPortPrivRec *pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 9032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int primary_crtc_x, primary_crtc_y, extend_crtc_x, extend_crtc_y; 9044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo enum pipe_id_t local_pipe = PIPEA, extend_pipe = PIPEB; 9052f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int surfacex = destx, surfacey = desty; 9064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo float xScaleFactor, yScaleFactor; 9074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo Rotation rotation = RR_Rotate_0; 9084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_output_device local_device, extend_device; 9094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_extvideo_subtitle subtitle; 9100e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 9110e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang if (flags & VA_CLEAR_DRAWABLE) { 912c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Clean draw with color 0x%08x\n", driver_data->clear_color); 9130e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang psb_cleardrawable_stopoverlay(ctx, draw, destx, desty, destw, desth); 914dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9150e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return VA_STATUS_SUCCESS; 9160e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 9172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 918dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (output->frame_count % 500 == 0 || driver_data->xrandr_update) { 919dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* get window screen coordination */ 920dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_x11_getWindowCoordinate(ctx->native_dpy, draw, &output->winRect, &output->bIsVisible); 921dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret != 0) { 922c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to get X11 window coordinates error # %d\n", __func__, ret); 923dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 924dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 9250e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 9260e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 927dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!output->bIsVisible) { 9280e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return VA_STATUS_SUCCESS; 9290e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 9300e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 931dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_surface) { 932c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Invalid surface id 0x%08x.\n", __func__, surface); 933dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_INVALID_SURFACE; 9344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 9354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (output->output_drawable != draw) { 9372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang output->output_drawable = draw; 938dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 939dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 940dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!output->gc) { 941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output->gc = XCreateGC((Display *)ctx->native_dpy, draw, 0, NULL); 9422f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /* paint the color key */ 943bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (!obj_surface->subpictures && !driver_data->overlay_auto_paint_color_key) { 9442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang XSetForeground((Display *)ctx->native_dpy, output->gc, pPriv->colorKey); 9452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, 0, 0, x11_window_width, x11_window_height); 9462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang XSync((Display *)ctx->native_dpy, False); 9472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 9482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 9492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 950dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->use_xrandr_thread && !driver_data->xrandr_thread_id) { 951dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_xrandr_thread_create(ctx); 952dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret != 0) { 953c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to create psb xrandr thread error # %d\n", __func__, ret); 954dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 955dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 957dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = psb_xrandr_local_crtc_coordinate(&local_device, &primary_crtc_x, &primary_crtc_y, &pPriv->display_width, &pPriv->display_height, &rotation); 9594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (ret != VA_STATUS_SUCCESS) { 960c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to get primary crtc coordinates error # %d\n", __func__, ret); 9612f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return VA_STATUS_ERROR_UNKNOWN; 9622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 9634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo switch (local_device) { 964dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case LVDS0: 965dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0: 966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_pipe = PIPEA; 967dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 968dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* single HDMI */ 969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case HDMI: 970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_pipe = PIPEB; 971dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 972dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI1: 973dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_pipe = PIPEC; 974dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 9754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 9764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!psb_xrandr_single_mode()) { 9784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 979dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_xrandr_extend_crtc_coordinate(&extend_device, &extend_crtc_x, &extend_crtc_y, 980dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &pPriv->extend_display_width, &pPriv->extend_display_height, &extend_location, &rotation); 981dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret != VA_STATUS_SUCCESS) { 982c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to get extend crtc coordinates error # %d\n", __func__, ret); 983dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 984dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 985dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 986dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (extend_device) { 987dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case HDMI: 988dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_pipe = PIPEB; 989dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 990dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI1: 991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_pipe = PIPEC; 992dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 993dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 994c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to get extend pipe\n", __func__); 995dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 996dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 997dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 9982f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 9992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /*clip in the window area*/ 10000e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang if (destx < 0) { 10012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang x11_window_width += destx; 10020e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang destx = 0; 10032f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 10042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 10050e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang if (desty < 0) { 10062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang x11_window_height += desty; 10070e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang desty = 0; 10082f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 10092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1010dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (srcx < 0) { 1011dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun srcw += srcx; 1012dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun srcx = 0; 10132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 1014dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1015dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (srcy < 0) { 10162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang srch += srcy; 10172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang srcy = 0; 10182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 10190e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + x11_window_width) > output->winRect.ui32Width) 1021dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_width = output->winRect.ui32Width - destx; 10222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1023dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + x11_window_height) > output->winRect.ui32Height) 1024dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_height = output->winRect.ui32Height - desty; 10252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 10262f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /*translate destx, desty into screen coordinate*/ 1027dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx += output->winRect.i32Left; 1028dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun desty += output->winRect.i32Top; 10292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 10302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang /*clip in the screen area*/ 1031dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun xScaleFactor = srcw * 1.0 / x11_window_width; 1032dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun yScaleFactor = srch * 1.0 / x11_window_height; 10334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (destx < 0) { 10352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang x11_window_width += destx; 10364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcx = (short)((-destx) * xScaleFactor); 10372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang destx = 0; 10382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 10392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 10402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (desty < 0) { 10412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang x11_window_height += desty; 10424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo srcy = (short)((-desty) * yScaleFactor); 10432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang desty = 0; 10442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 10454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* display by overlay */ 1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_single_mode() || IS_MRST(driver_data)) { 10484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((destx + x11_window_width) > pPriv->display_width) { 1049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_width = pPriv->display_width - destx; 1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun srcw = (unsigned short)(x11_window_width * xScaleFactor); 1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 10522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + x11_window_height) > pPriv->display_height) { 1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_height = pPriv->display_height - desty; 1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun srch = (unsigned short)(x11_window_height * yScaleFactor); 1056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 10574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1058bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (!driver_data->overlay_auto_paint_color_key) { 1059bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ret = psb_repaint_colorkey(ctx, draw, surface, x11_window_width, x11_window_height); 1060bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (ret != 0) { 1061c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to repaint color key error # %d\n", __func__, ret); 1062bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return VA_STATUS_ERROR_UNKNOWN; 1063bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 10642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 10652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 10664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_putsurface_overlay( 10674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ctx, surface, srcx, srcy, srcw, srch, 1068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* screen coordinate */ 1069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx, desty, x11_window_width, x11_window_height, 1070dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_A, local_pipe); 10714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else if (psb_xrandr_clone_mode()) { 10724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_overlay_rect_t local_rect, extend_rect; 10734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (output->extend_drawable) { 10754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XDestroyWindow(ctx->native_dpy, output->extend_drawable); 10764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo output->extend_drawable = 0; 10774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFreeGC((Display *)ctx->native_dpy, output->extend_gc); 1078dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output->extend_gc = 0; 10794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1081dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((destx + x11_window_width) < pPriv->display_width) && 1082bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((destx + x11_window_width) < pPriv->extend_display_width)) 10834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dWidth = extend_rect.dWidth = x11_window_width; 10844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else if (pPriv->display_width < pPriv->extend_display_width) { 10854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dWidth = pPriv->display_width - destx; 10864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((destx + x11_window_width) > pPriv->extend_display_width) 10874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.dWidth = x11_window_width = pPriv->extend_display_width - destx; 1088dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 10894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.dWidth = x11_window_width; 10904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else { 10914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.dWidth = pPriv->extend_display_width - destx; 10924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((destx + x11_window_width) > pPriv->display_width) 10934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dWidth = x11_window_width = pPriv->display_width - destx; 1094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 10954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dWidth = x11_window_width; 10960e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 10970e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1098dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (((desty + x11_window_height) < pPriv->display_height) && 1099bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((desty + x11_window_height) < pPriv->extend_display_height)) 11004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dHeight = extend_rect.dHeight = x11_window_height; 11014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else if (pPriv->display_height < pPriv->extend_display_height) { 11024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dHeight = pPriv->display_height - desty; 11034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((desty + x11_window_height) > pPriv->extend_display_height) 11044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.dHeight = x11_window_height = pPriv->extend_display_height - desty; 1105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 11064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.dHeight = x11_window_height; 11074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else { 11084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.dHeight = pPriv->extend_display_height - desty; 1109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + x11_window_height) > pPriv->display_height) 11104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dHeight = x11_window_height = pPriv->display_height - desty; 1111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 11124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.dHeight = x11_window_height; 11134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 11144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if ((driver_data->mipi0_rotation != VA_ROTATION_NONE) || 1115bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (driver_data->hdmi_rotation != VA_ROTATION_NONE)) { 11164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.sWidth = srcw; 11174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.sHeight = srch; 11184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.sWidth = srcw; 11194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.sHeight = srch; 11204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else { 11214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.sWidth = (unsigned short)(local_rect.dWidth * xScaleFactor); 11224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo local_rect.sHeight = (unsigned short)(local_rect.dHeight * yScaleFactor); 11234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.sWidth = (unsigned short)(extend_rect.dWidth * xScaleFactor); 11244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo extend_rect.sHeight = (unsigned short)(extend_rect.dHeight * yScaleFactor); 11254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 11264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = psb_repaint_colorkey(ctx, draw, surface, x11_window_width, x11_window_height); 11274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (ret != 0) { 1128c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to repaint color key error # %d\n", __func__, ret); 11294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_ERROR_UNKNOWN; 11304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 11314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_putsurface_overlay( 1132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, srcx, srcy, extend_rect.sWidth, extend_rect.sHeight, 1133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* screen coordinate */ 1134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx, desty, extend_rect.dWidth, extend_rect.dHeight, 1135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_C, extend_pipe); 11364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_putsurface_overlay( 1137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, srcx, srcy, local_rect.sWidth, local_rect.sHeight, 1138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* screen coordinate */ 1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx, desty, local_rect.dWidth, local_rect.dHeight, 1140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_A, local_pipe); 11414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else if (psb_xrandr_extend_mode()) { 1142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->extend_fullscreen) { 1143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (extend_location) { 11444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case RIGHT_OF: 1145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XMoveResizeWindow(ctx->native_dpy, output->output_drawable, pPriv->display_width, 0, pPriv->extend_display_width, pPriv->extend_display_height); 1146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 11474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case BELOW: 1148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XMoveResizeWindow(ctx->native_dpy, output->output_drawable, 0, pPriv->display_height, pPriv->extend_display_width, pPriv->extend_display_height); 11494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 11504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case LEFT_OF: 11514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case ABOVE: 1152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XMoveResizeWindow(ctx->native_dpy, output->output_drawable, 0, 0, pPriv->extend_display_width, pPriv->extend_display_height); 1153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 11554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XSetForeground((Display *)ctx->native_dpy, output->gc, pPriv->colorKey); 1159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, 0, 0, pPriv->extend_display_width, pPriv->extend_display_height); 1160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XFlush(ctx->native_dpy); 1161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_putsurface_overlay( 1163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, srcx, srcy, srcw, srch, 1164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* screen coordinate */ 1165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 0, pPriv->extend_display_width, pPriv->extend_display_height, 1166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_A, PIPEB); 1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_overlay_rect_t local_rect, extend_rect; 1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun enum overlay_id_t extend_overlay = OVERLAY_C; 1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (output->extend_drawable) { 1172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XDestroyWindow(ctx->native_dpy, output->extend_drawable); 1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output->extend_drawable = 0; 1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XFreeGC((Display *)ctx->native_dpy, output->extend_gc); 1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output->extend_gc = 0; 1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(&local_rect, 0, sizeof(psb_overlay_rect_t)); 1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(&extend_rect, 0, sizeof(psb_overlay_rect_t)); 1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_extendMode_getCoordinate(pPriv, extend_location, destx, desty, srcx, srcy, 1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun xScaleFactor, yScaleFactor, &x11_window_width, &x11_window_height, 1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &local_rect, &extend_rect, &extend_overlay); 1182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_repaint_colorkey(ctx, draw, surface, x11_window_width, x11_window_height); 1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret != 0) { 1185c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to repaint color key error # %d\n", __func__, ret); 1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((extend_rect.dWidth > 0) && (extend_rect.dHeight > 0)) { 1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_putsurface_overlay( 1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, 1192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect.srcx, extend_rect.srcy, extend_rect.sWidth, extend_rect.sHeight, 1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_rect.destx, extend_rect.desty, extend_rect.dWidth, extend_rect.dHeight, 1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, extend_overlay, extend_pipe); 1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((local_rect.dWidth > 0) && (local_rect.dHeight > 0)) { 1197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_putsurface_overlay( 1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, 1199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect.srcx, local_rect.srcy, local_rect.sWidth, local_rect.sHeight, 1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_rect.destx, local_rect.desty, local_rect.dWidth, local_rect.dHeight, 1201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_A, local_pipe); 1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 12034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 1204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (psb_xrandr_extvideo_mode()) { 1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int xres, yres, xoffset, yoffset, overscanmode, pannelfitting, x, y; 1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_extvideo_center center; 1207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_extvideo_prop(&xres, &yres, &xoffset, &yoffset, ¢er, &subtitle, &overscanmode, &pannelfitting); 1209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x = xoffset; 1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun y = yoffset; 12110e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (extend_location) { 1213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case RIGHT_OF: 1214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x += pPriv->display_width; 1215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case BELOW: 1217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun y += pPriv->display_height; 1218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case NORMAL: 1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case LEFT_OF: 1222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->xrandr_dirty & PSB_NEW_EXTVIDEO) { 1223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx += pPriv->extend_display_width; 1224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XMoveResizeWindow(ctx->native_dpy, output->output_drawable, destx, desty, x11_window_width, x11_window_height); 1225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, 0, 0, x11_window_width, x11_window_height); 1226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XFlush(ctx->native_dpy); 1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx = destx - pPriv->extend_display_width; 1229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case ABOVE: 1231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->xrandr_dirty & PSB_NEW_EXTVIDEO) { 1232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun desty += pPriv->extend_display_height; 1233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XMoveResizeWindow(ctx->native_dpy, output->output_drawable, destx, desty, x11_window_width, x11_window_height); 1234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XFillRectangle((Display *)ctx->native_dpy, draw, output->gc, 0, 0, x11_window_width, x11_window_height); 1235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XFlush(ctx->native_dpy); 1236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun desty = desty - pPriv->extend_display_height; 1238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((destx + x11_window_width) > pPriv->display_width) 1241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_width = pPriv->display_width - destx; 1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((desty + x11_window_height) > pPriv->display_height) 1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_height = pPriv->display_height - desty; 1244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->xrandr_dirty & PSB_NEW_EXTVIDEO) { 1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun Window extend_win; 1247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_win = psb_xrandr_create_full_screen_window(x, y, xres, yres); 12484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (output->extend_drawable != extend_win) { 12494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo output->extend_drawable = extend_win; 12504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (output->extend_gc) 12514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFreeGC((Display *)ctx->native_dpy, output->extend_gc); 1252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output->extend_gc = XCreateGC((Display *)ctx->native_dpy, extend_win, 0, NULL); 12530e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 12544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* paint the color key */ 12554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!obj_surface->subpictures) { 12564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSetForeground((Display *)ctx->native_dpy, output->extend_gc, pPriv->colorKey); 12574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFillRectangle((Display *)ctx->native_dpy, extend_win, output->extend_gc, 0, 0, xres, yres); 12584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XSync((Display *)ctx->native_dpy, False); 12594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 12600e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 1261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->xrandr_dirty &= ~PSB_NEW_EXTVIDEO; 12620e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang } 12630e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 12644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = psb_repaint_colorkey(ctx, draw, surface, x11_window_width, x11_window_height); 12654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (ret != 0) { 1266c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to repaint color key error # %d\n", __func__, ret); 12674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_ERROR_UNKNOWN; 12684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 12690e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 12702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang psb_putsurface_overlay( 12712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang ctx, surface, srcx, srcy, srcw, srch, 1272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* screen coordinate */ 1273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun xoffset, yoffset, xres, yres, 1274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_C, PIPEB); 1275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_putsurface_overlay( 1276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ctx, surface, srcx, srcy, srcw, srch, 1277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* screen coordinate */ 1278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun destx, desty, 1279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun x11_window_width, x11_window_height, 1280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags, OVERLAY_A, local_pipe); 12814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 1282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*Init Overlay subpicuture blending and make proper clear.*/ 12844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (pPriv->is_mfld && obj_surface->subpictures) { 12854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo PsbVASurfaceRec *subpicture = (PsbVASurfaceRec *)obj_surface->subpictures; 12864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 12874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_init_subpicture(ctx, pPriv); 12884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /*clear changed subpicture zones in drawable.*/ 12894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_clear_subpictures(ctx, pPriv, x11_window_width, x11_window_height, obj_surface); 12904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (pPriv->subpic_clear_flag) { 12914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_DisplayRGBASubpicture(subpicture, ctx, x11_window_width, x11_window_height, 1292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surfacex, surfacey, obj_surface->width, obj_surface->height, subtitle); 12932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 12942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 12950e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang 1296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output->frame_count++; 1297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12980e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang return VA_STATUS_SUCCESS; 12990e1db7cbdd7ea667fcbc9409f85e14420cb8ae9cFei Jiang} 1300