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(&regs, 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, &regs, 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, &center, &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