1bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3f91c8768670386683a281cc39141e21bdda9c97fKun Wang *
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.
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang *
24bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Jason Hu  <jason.hu@intel.com>
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Zhaohan Ren  <zhaohan.ren@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
300da1930627209986e8db220799a690f816494401Austin Yuan#include <unistd.h>
31643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#include "psb_xrandr.h"
32643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#include "psb_x11.h"
33f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h"
34643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Global variable for xrandr */
36643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangpsb_xrandr_info_p psb_xrandr_info;
374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData
39dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#define INIT_OUTPUT_PRIV    psb_x11_output_p output = (psb_x11_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv)
40643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
41643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#define MWM_HINTS_DECORATIONS (1L << 1)
42dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef struct {
43dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int flags;
44dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int functions;
45dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int decorations;
46dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int input_mode;
47dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int status;
48643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} MWMHints;
49643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangchar* location2string(psb_xrandr_location location)
51643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
52dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (location) {
53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case ABOVE:
54dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return "ABOVE";
55dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case BELOW:
57dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return "BELOW";
58dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
59dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case LEFT_OF:
60dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return "LEFT_OF";
61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
62dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case RIGHT_OF:
63dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return "RIGHT_OF";
64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
65dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return "NORMAL";
67dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
68643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
69643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
70643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic int RRrotation2VArotation(Rotation rotation)
72643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    switch (rotation) {
74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case RR_Rotate_0:
75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_ROTATION_NONE;
76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case RR_Rotate_90:
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_ROTATION_270;
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case RR_Rotate_180:
79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_ROTATION_180;
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case RR_Rotate_270:
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_ROTATION_90;
82643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return 0;
85643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
86643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic psb_xrandr_crtc_p get_crtc_by_id(RRCrtc crtc_id)
87643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
88643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_crtc_p p_crtc;
894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    for (p_crtc = psb_xrandr_info->crtc_head; p_crtc; p_crtc = p_crtc->next)
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (p_crtc->crtc_id == crtc_id)
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return p_crtc;
92643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return NULL;
93643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
94643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_xrandr_hdmi_property(VADriverContextP ctx)
96643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    INIT_DRIVER_DATA;
98643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Atom *props;
99643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Atom actual_type;
1004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    XRRPropertyInfo *propinfo;
1014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int i, nprop, actual_format;
1024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned long nitems, bytes_after;
1034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    char* prop_name;
104643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    unsigned char* prop;
105643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* Check HDMI properties */
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    props = XRRListOutputProperties(psb_xrandr_info->dpy, psb_xrandr_info->extend_output->output_id, &nprop);
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!props) {
109c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: XRRListOutputProperties failed\n", psb_xrandr_info->extend_output->output_id);
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
113c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: extend output %08x has %d properties\n", psb_xrandr_info->extend_output->output_id, nprop);
114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < nprop; i++) {
116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        XRRGetOutputProperty(psb_xrandr_info->dpy, psb_xrandr_info->extend_output->output_id, props[i],
117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             0, 100, False, False, AnyPropertyType, &actual_type, &actual_format,
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             &nitems, &bytes_after, &prop);
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        propinfo = XRRQueryOutputProperty(psb_xrandr_info->dpy, psb_xrandr_info->extend_output->output_id, props[i]);
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!propinfo) {
122c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: get output %08x prop %08x failed\n", psb_xrandr_info->extend_output->output_id, props[i]);
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return;
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        prop_name = XGetAtomName(psb_xrandr_info->dpy, props[i]);
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Currently all properties are XA_INTEGER, 32 */
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!strcmp(prop_name, "ExtVideoMode")) {
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode = (int)((INT32*)prop)[0];
131c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtVideoMode (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode);
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "ExtVideoMode_Xres")) {
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes = (int)((INT32*)prop)[0];
134c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtVideoMode_XRes (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes);
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "ExtVideoMode_Yres")) {
136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes = (int)((INT32*)prop)[0];
137c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtVideoMode_YRes (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes);
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "ExtVideoMode_X_Offset")) {
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset = (int)((INT32*)prop)[0];
140c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtVideoMode_X_Offset (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset);
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "ExtVideoMode_Y_Offset")) {
142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset = (int)((INT32*)prop)[0];
143c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtVideoMode_Y_Offset (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset);
144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "ExtVideoMode_Center")) {
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center = (int)((INT32*)prop)[0];
146c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtVideoMode_Center (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center);
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "ExtVideoMode_SubTitle")) {
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle = (int)((INT32*)prop)[0];
149c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtVideoMode_SubTitle (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle);
150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "ExtDesktopMode")) {
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if ((psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode != EXTENDEDVIDEO) &&
152bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                ((int)((INT32*)prop)[0] == EXTENDEDVIDEO)) {
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                driver_data->xrandr_dirty |= PSB_NEW_EXTVIDEO;
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = (int)((INT32*)prop)[0];
156c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: ExtDesktopMode (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode);
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "OverscanMode")) {
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->OverscanMode = (int)((INT32*)prop)[0];
159c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: OverscanMode (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->OverscanMode);
160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (!strcmp(prop_name, "PANELFITTING")) {
161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->hdmi_extvideo_prop->PANELFITTING = (int)((INT32*)prop)[0];
162c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: PANELFITTING (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->PANELFITTING);
163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
1654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
166643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
1674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_xrandr_mipi_location_init(psb_output_device_mode output_device_mode)
1684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
1690da1930627209986e8db220799a690f816494401Austin Yuan    psb_xrandr_crtc_p local_crtc = NULL, extend_crtc = NULL;
1704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    switch (output_device_mode) {
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case SINGLE_MIPI0:
173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE;
174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->local_crtc[0]->location = NORMAL;
175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case SINGLE_MIPI1:
177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE;
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->local_crtc[1]->location = NORMAL;
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_MIPI1:
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        local_crtc = psb_xrandr_info->local_crtc[0];
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        extend_crtc = psb_xrandr_info->local_crtc[1];
183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
1864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
187643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
1884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!local_crtc || !extend_crtc) {
189c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to get crtc info\n");
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
1914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
192643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
1934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* MIPI1 clone MIPI0 */
1944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (local_crtc->x == 0 && local_crtc->y == 0 &&
195bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        extend_crtc->x == 0 && extend_crtc->y == 0) {
196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = CLONE;
197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        extend_crtc->location = NORMAL;
1984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    } else {
199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* MIPI1 entend MIPI0 */
200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = EXTENDED;
201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (local_crtc->y == extend_crtc->height)
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            extend_crtc->location = ABOVE;
2034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else if (extend_crtc->y == local_crtc->height)
204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            extend_crtc->location = BELOW;
2054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else if (local_crtc->x == extend_crtc->width)
206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            extend_crtc->location = LEFT_OF;
2074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else if (extend_crtc->x == local_crtc->width)
208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            extend_crtc->location = RIGHT_OF;
2094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
2114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_xrandr_hdmi_location_init(psb_output_device_mode output_device_mode)
2134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
2140da1930627209986e8db220799a690f816494401Austin Yuan    psb_xrandr_crtc_p local_crtc = NULL, extend_crtc = NULL;
215643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
2164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    switch (output_device_mode) {
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case SINGLE_HDMI:
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE;
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->extend_crtc->location = NORMAL;
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_HDMI:
222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_MIPI1_HDMI:
223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        local_crtc = psb_xrandr_info->local_crtc[0];
224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        extend_crtc = psb_xrandr_info->extend_crtc;
225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI1_HDMI:
227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        local_crtc = psb_xrandr_info->local_crtc[1];
228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        extend_crtc = psb_xrandr_info->extend_crtc;
229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!local_crtc || !extend_crtc) {
235c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to get crtc info\n");
236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == CLONE)
240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->extend_crtc->location = NORMAL;
2414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDED
243bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        || psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDEDVIDEO) {
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (local_crtc->y == extend_crtc->height)
245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->extend_crtc->location = ABOVE;
246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else if (extend_crtc->y == local_crtc->height)
247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->extend_crtc->location = BELOW;
248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else if (local_crtc->x == extend_crtc->width)
249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->extend_crtc->location = LEFT_OF;
250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else if (extend_crtc->x == local_crtc->width)
251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->extend_crtc->location = RIGHT_OF;
2524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
2544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_xrandr_coordinate_init(VADriverContextP ctx)
2564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
2574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_DRIVER_DATA;
2584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_output_p p_output;
2594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_info->output_changed = 1;
2614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    for (p_output = psb_xrandr_info->output_head; p_output; p_output = p_output->next) {
263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (p_output->connection == RR_Connected) {
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (!strcmp(p_output->name, "MIPI0")) {
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (p_output->crtc) {
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->mipi0_enabled = 1;
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_output[0] = p_output;
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_crtc[0] = p_output->crtc;
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (psb_xrandr_info->mipi0_rotation != p_output->crtc->rotation) {
270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        psb_xrandr_info->mipi0_rotation = p_output->crtc->rotation;
271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        driver_data->mipi0_rotation = RRrotation2VArotation(psb_xrandr_info->mipi0_rotation);
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        driver_data->xrandr_dirty |= PSB_NEW_ROTATION;
273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    }
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else {
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->mipi0_enabled = 0;
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_output[0] = NULL;
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_crtc[0] = NULL;
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                }
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (!strcmp(p_output->name, "MIPI1")) {
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (p_output->crtc) {
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->mipi1_enabled = 1;
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_output[1] = p_output;
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_crtc[1] = p_output->crtc;
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (psb_xrandr_info->mipi1_rotation != p_output->crtc->rotation) {
285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        psb_xrandr_info->mipi1_rotation = p_output->crtc->rotation;
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        driver_data->mipi1_rotation = RRrotation2VArotation(psb_xrandr_info->mipi1_rotation);
287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        driver_data->xrandr_dirty |= PSB_NEW_ROTATION;
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    }
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else {
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->mipi1_enabled = 0;
291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_output[1] = NULL;
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_crtc[1] = NULL;
293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                }
294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (!strcmp(p_output->name, "TMDS0-1")) {
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (p_output->crtc) {
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->hdmi_enabled = 1;
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->extend_output = p_output;
298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->extend_crtc = p_output->crtc;
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (psb_xrandr_info->hdmi_rotation != p_output->crtc->rotation) {
300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        psb_xrandr_info->hdmi_rotation = p_output->crtc->rotation;
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        driver_data->hdmi_rotation = RRrotation2VArotation(psb_xrandr_info->hdmi_rotation);
302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        driver_data->xrandr_dirty |= PSB_NEW_ROTATION;
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    }
304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else {
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->hdmi_enabled = 0;
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->extend_output = NULL;
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->extend_crtc = NULL;
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                }
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (!strcmp(p_output->name, "LVDS0") && IS_MRST(driver_data)) {
310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (p_output->crtc) {
311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->lvds0_enabled = 1;
312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_output[0] = p_output;
313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_crtc[0] = p_output->crtc;
314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else {
315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->lvds0_enabled = 0;
316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_output[0] = NULL;
317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    psb_xrandr_info->local_crtc[0] = NULL;
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                }
319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
3214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* for MRST */
3244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (IS_MRST(driver_data) && psb_xrandr_info->lvds0_enabled) {
325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE;
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->output_device_mode = SINGLE_LVDS0;
327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->local_crtc[0]->location = NORMAL;
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
3294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* HDMI + either MIPI0 or MIPI1 */
3324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (psb_xrandr_info->hdmi_enabled) {
3334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Get HDMI properties if it is enabled*/
335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_hdmi_property(ctx);
3364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Only HDMI */
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!psb_xrandr_info->mipi0_enabled && !psb_xrandr_info->mipi1_enabled)
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_device_mode = SINGLE_HDMI;
3404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* HDMI + MIPI0 */
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (psb_xrandr_info->mipi0_enabled && !psb_xrandr_info->mipi1_enabled)
343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_device_mode = MIPI0_HDMI;
3444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* HDMI + MIPI1 */
346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!psb_xrandr_info->mipi0_enabled && psb_xrandr_info->mipi1_enabled)
347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_device_mode = MIPI1_HDMI;
3484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* HDMI + MIPI0 + MIPI1 */
350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (psb_xrandr_info->mipi0_enabled && psb_xrandr_info->mipi1_enabled)
351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_device_mode = MIPI0_MIPI1_HDMI;
3524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_hdmi_location_init(psb_xrandr_info->output_device_mode);
3544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    } else {
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* MIPI0 + MIPI1 */
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (psb_xrandr_info->mipi0_enabled && psb_xrandr_info->mipi1_enabled) {
357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_device_mode = MIPI0_MIPI1;
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* MIPI0/MIPI1 */
360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (psb_xrandr_info->mipi0_enabled)
361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb_xrandr_info->output_device_mode = SINGLE_MIPI0;
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            else if (psb_xrandr_info->mipi1_enabled)
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb_xrandr_info->output_device_mode = SINGLE_MIPI1;
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_mipi_location_init(psb_xrandr_info->output_device_mode);
367643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
368643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
369643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
3704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_xrandr_refresh(VADriverContextP ctx)
371643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
3724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int i;
373643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
374643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XRROutputInfo *output_info;
375643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XRRCrtcInfo *crtc_info;
376643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
377643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_crtc_p p_crtc;
378643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_output_p p_output;
379643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
3804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
381643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    //deinit crtc
383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_xrandr_info->crtc_head) {
384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while (psb_xrandr_info->crtc_head) {
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->crtc_tail = psb_xrandr_info->crtc_head->next;
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(psb_xrandr_info->crtc_head);
388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail;
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail = NULL;
3924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
393643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < psb_xrandr_info->res->ncrtc; i++) {
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        crtc_info = XRRGetCrtcInfo(psb_xrandr_info->dpy, psb_xrandr_info->res, psb_xrandr_info->res->crtcs[i]);
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (crtc_info) {
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc = (psb_xrandr_crtc_p)calloc(1, sizeof(psb_xrandr_crtc_s));
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (!p_crtc) {
399c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_ERROR, "output of memory\n");
4004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                return;
4014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
402643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (i == 0)
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail = p_crtc;
405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->crtc_id = psb_xrandr_info->res->crtcs[i];
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->x = crtc_info->x;
408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->y = crtc_info->y;
409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->width = crtc_info->width;
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->height = crtc_info->height;
411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->crtc_mode = crtc_info->mode;
412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->noutput = crtc_info->noutput;
413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->rotation = crtc_info->rotation;
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->crtc_tail->next = p_crtc;
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_crtc->next = NULL;
417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->crtc_tail = p_crtc;
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
419c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to get crtc_info\n");
4204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return;
422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
423643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
424643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
425643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //deinit output
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_xrandr_info->output_head) {
427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while (psb_xrandr_info->output_head) {
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_tail = psb_xrandr_info->output_head->next;
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(psb_xrandr_info->output_head);
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_head = psb_xrandr_info->output_tail;
433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->output_head = psb_xrandr_info->output_tail = NULL;
435643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
4364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0
4374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    //destroy the full-screen window
4384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    //FIXME: commited out for X Error message: BadDrawable, need more investigation
4394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (va_output) {
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (va_output->extend_drawable) {
441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            XDestroyWindow(ctx->native_dpy, va_output->extend_drawable);
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            va_output->extend_drawable = 0;
443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            texture_priv->extend_dri_init_flag = 0;
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
4454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
4464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < psb_xrandr_info->res->noutput; i++) {
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        output_info = XRRGetOutputInfo(psb_xrandr_info->dpy, psb_xrandr_info->res, psb_xrandr_info->res->outputs[i]);
449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (output_info) {
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_output = (psb_xrandr_output_p)calloc(1, sizeof(psb_xrandr_output_s));
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (!p_output) {
452c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_ERROR, "output of memory\n");
4534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                return;
4544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
455643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (i == 0)
457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb_xrandr_info->output_head = psb_xrandr_info->output_tail = p_output;
458643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_output->output_id = psb_xrandr_info->res->outputs[i];
460643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_output->connection = output_info->connection;
462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (p_output->connection == RR_Connected)
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb_xrandr_info->nconnected_output++;
464643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            strcpy(p_output->name, output_info->name);
466643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (output_info->crtc)
468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p_output->crtc = get_crtc_by_id(output_info->crtc);
469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            else
470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p_output->crtc = NULL;
471643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_tail->next = p_output;
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_output->next = NULL;
474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_tail = p_output;
475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
476c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to get output_info\n");
477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return;
479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
480643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
481643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
4824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_coordinate_init(ctx);
4830da1930627209986e8db220799a690f816494401Austin Yuan
4840da1930627209986e8db220799a690f816494401Austin Yuan    psb_RecalcRotate(ctx);
4854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
486643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
487643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
488bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic Bool
489bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun WangoutputChangePredicate(Display *display, XEvent *event, char *args)
490bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang{
491bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    int event_base, error_base;
492bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
493bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    XRRQueryExtension(psb_xrandr_info->dpy, &event_base, &error_base);
494bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    return ((event->type == event_base + RRNotify_OutputChange) ||
495bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            ((event->type == ClientMessage) &&
496bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang             (((XClientMessageEvent*)event)->message_type == psb_xrandr_info->psb_exit_atom)));
497bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang}
498bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
4994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_xrandr_thread(void* arg)
500643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
5014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VADriverContextP ctx = (VADriverContextP)arg;
502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    INIT_DRIVER_DATA;
503643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int event_base, error_base;
504643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XEvent event;
5054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    XRRQueryExtension(psb_xrandr_info->dpy, &event_base, &error_base);
5064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    XRRSelectInput(psb_xrandr_info->dpy, psb_xrandr_info->root, RRScreenChangeNotifyMask | RRCrtcChangeNotifyMask | RROutputChangeNotifyMask | RROutputPropertyNotifyMask);
507c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: psb xrandr thread start\n");
508643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (1) {
510bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (XCheckIfEvent(psb_xrandr_info->dpy, (XEvent *)&event, outputChangePredicate, NULL)) {
511bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            if (event.type == ClientMessage) {
512c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: receive ClientMessage event, thread should exit\n");
513bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                XClientMessageEvent *evt;
514bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                evt = (XClientMessageEvent*) & event;
515bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                if (evt->message_type == psb_xrandr_info->psb_exit_atom) {
516c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: xrandr thread exit safely\n");
517bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                    pthread_exit(NULL);
518bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                }
519bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            }
520bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            switch (event.type - event_base) {
521bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            case RRNotify_OutputChange:
522bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                XRRUpdateConfiguration(&event);
523c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: receive RRNotify_OutputChange event, refresh output/crtc info\n");
524bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                driver_data->xrandr_update = 1;
525bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                psb_xrandr_refresh(ctx);
526bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                break;
527bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            default:
528bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                break;
5292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            }
530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
531bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        usleep(200000);
532643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
533643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
534643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
5354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoWindow psb_xrandr_create_full_screen_window(unsigned int destx, unsigned int desty, unsigned int destw, unsigned int desth)
536643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
537643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int x, y, width, height;
538643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Window win;
539643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
540643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    x = psb_xrandr_info->extend_crtc->x;
541643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    y = psb_xrandr_info->extend_crtc->y;
542643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    width = psb_xrandr_info->extend_crtc->width;
543643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    height = psb_xrandr_info->extend_crtc->height;
544643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
5454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (destw == 0 || desth == 0) {
5464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        destw = width;
5474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        desth = height;
5484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
5494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    win = XCreateSimpleWindow(psb_xrandr_info->dpy, DefaultRootWindow(psb_xrandr_info->dpy), destx, desty, destw, desth, 0, 0, 0);
550643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
551643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    MWMHints mwmhints;
552643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Atom MOTIF_WM_HINTS;
553643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
554643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    mwmhints.flags = MWM_HINTS_DECORATIONS;
555643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    mwmhints.decorations = 0; /* MWM_DECOR_BORDER */
5564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    MOTIF_WM_HINTS = XInternAtom(psb_xrandr_info->dpy, "_MOTIF_WM_HINTS", False);
557bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    XChangeProperty(psb_xrandr_info->dpy, win, MOTIF_WM_HINTS, MOTIF_WM_HINTS, sizeof(long) * 8,
558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    PropModeReplace, (unsigned char*) &mwmhints, sizeof(mwmhints) / sizeof(long));
559643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
560643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XSetWindowAttributes attributes;
561643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    attributes.override_redirect = 1;
562643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    unsigned long valuemask;
563643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    valuemask = CWOverrideRedirect ;
5644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    XChangeWindowAttributes(psb_xrandr_info->dpy, win, valuemask, &attributes);
565643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
5664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    XMapWindow(psb_xrandr_info->dpy, win);
5674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    XFlush(psb_xrandr_info->dpy);
568643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return win;
569643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
570643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
5714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_xrandr_hdmi_enabled()
572643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
5734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int ret;
5744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
5754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = psb_xrandr_info->hdmi_enabled;
5764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
5774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return ret;
578643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
5794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
5804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_xrandr_mipi0_enabled()
581643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
582643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
5834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
5844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = psb_xrandr_info->mipi0_enabled;
5854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
586643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
587643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
588643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
5894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_xrandr_mipi1_enabled()
590643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
591643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
5924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
5934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = psb_xrandr_info->mipi1_enabled;
5944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
595643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
596643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
597643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
598643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_single_mode()
599643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
600643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
6014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
6024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == SINGLE) ? 1 : 0;
6034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
604643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
605643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
606643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
607643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_clone_mode()
608643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
609643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
6104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
6114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == CLONE) ? 1 : 0;
6124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
613643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
614643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
615643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
616643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_extend_mode()
617643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
618643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
6194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
6204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDED) ? 1 : 0;
6214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
622643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
623643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
624643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
625643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_extvideo_mode()
626643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
627643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
6284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
6294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDEDVIDEO) ? 1 : 0;
6304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
631643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
632643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
633643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
634643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_outputchanged()
635643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
636643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
6374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_xrandr_info->output_changed) {
639643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        psb_xrandr_info->output_changed = 0;
640643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        ret = 1;
641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
642643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        ret = 0;
6434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
644643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
645643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
646643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_xrandr_extvideo_prop(unsigned int *xres, unsigned int *yres, unsigned int *xoffset,
648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  unsigned int *yoffset, psb_extvideo_center *center, psb_extvideo_subtitle *subtitle,
649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  unsigned int *overscanmode, unsigned int *pannelfitting)
650643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
6514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
652643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode != EXTENDEDVIDEO) {
6544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
656643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
657643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
658643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *xres = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes;
659643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *yres = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes;
660643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *xoffset = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset;
661643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *yoffset = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset;
662643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *center = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center;
663643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *subtitle = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle;
6644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *pannelfitting = psb_xrandr_info->hdmi_extvideo_prop->PANELFITTING;
6654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *overscanmode = psb_xrandr_info->hdmi_extvideo_prop->OverscanMode;
666643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
6674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
668643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return VA_STATUS_SUCCESS;
669643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
670643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
6714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoVAStatus psb_xrandr_local_crtc_coordinate(psb_output_device *local_device_enabled, int *x, int *y, int *width, int *height, Rotation *rotation)
672643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
6734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_crtc_p p_crtc;
6744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
6754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    switch (psb_xrandr_info->output_device_mode) {
677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case SINGLE_LVDS0:
678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *local_device_enabled = LVDS0;
679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_crtc = psb_xrandr_info->local_crtc[0];
680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case SINGLE_MIPI0:
682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_MIPI1:
683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_HDMI:
684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_MIPI1_HDMI:
685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *local_device_enabled = MIPI0;
686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_crtc = psb_xrandr_info->local_crtc[0];
687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
688dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case SINGLE_MIPI1:
689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI1_HDMI:
690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *local_device_enabled = MIPI1;
691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_crtc = psb_xrandr_info->local_crtc[1];
692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case SINGLE_HDMI:
694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *local_device_enabled = HDMI;
695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_crtc = psb_xrandr_info->extend_crtc;
696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
698c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: Unknown statue\n");
699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
7024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
7034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (p_crtc) {
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *x = p_crtc->x;
706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *y = p_crtc->y;
707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *width = p_crtc->width;
708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *height = p_crtc->height;
709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *rotation = p_crtc->rotation;
710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
711c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: device %08x enabled, crtc %08x coordinate: x = %d, y = %d, widht = %d, height = %d, rotate = %08x\n",
712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 *local_device_enabled, p_crtc->crtc_id, *x, *y, *width + 1, *height + 1, *rotation);
713dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_SUCCESS;
7144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    } else {
715c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: local device is not available\n");
716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
718643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
719643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
720643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
7214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoVAStatus psb_xrandr_extend_crtc_coordinate(psb_output_device *extend_device_enabled, int *x, int *y, int *width, int *height, psb_xrandr_location *location, Rotation *rotation)
722643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
7234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_crtc_p p_crtc;
724643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
7254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
7264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    switch (psb_xrandr_info->output_device_mode) {
728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_MIPI1:
729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *extend_device_enabled = MIPI1;
730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_crtc = psb_xrandr_info->local_crtc[1];
731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_HDMI:
733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI0_MIPI1_HDMI:
734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case MIPI1_HDMI:
735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *extend_device_enabled = HDMI;
736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_crtc = psb_xrandr_info->extend_crtc;
737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
739c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: Unknown status, may be extend device is not available\n");
740dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
742dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
743643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
744643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
7454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (p_crtc) {
7464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        *x = p_crtc->x;
7474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        *y = p_crtc->y;
7484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        *width = p_crtc->width;
7494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        *height = p_crtc->height;
7504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        *location = p_crtc->location;
7514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        *rotation = p_crtc->rotation;
752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
753c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: extend device %08x enabled, crtc %08x coordinate: x = %d, y = %d, widht = %d, height = %d, location = %s, rotation = %08x\n",
754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 *extend_device_enabled, p_crtc->crtc_id, *x, *y, *width + 1, *height + 1, location2string(p_crtc->location), *rotation);
7554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    } else {
756c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: extend device is not available\n");
757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
7584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        return VA_STATUS_ERROR_UNKNOWN;
7594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
760dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
761643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return VA_STATUS_SUCCESS;
762643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
763643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_xrandr_thread_exit()
765643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
766643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
767bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
768dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    XSelectInput(psb_xrandr_info->dpy, psb_xrandr_info->root, StructureNotifyMask);
769643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XClientMessageEvent xevent;
770643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    xevent.type = ClientMessage;
7714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    xevent.message_type = psb_xrandr_info->psb_exit_atom;
772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    xevent.window = psb_xrandr_info->root;
773643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    xevent.format = 32;
774dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = XSendEvent(psb_xrandr_info->dpy, psb_xrandr_info->root, 0, StructureNotifyMask, (XEvent*) & xevent);
7754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    XFlush(psb_xrandr_info->dpy);
7762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (!ret) {
777c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: send thread exit event to drawable: failed\n");
778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
780c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Xrandr: send thread exit event to drawable: success\n");
781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_SUCCESS;
782643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
7832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
7842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
7852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei JiangVAStatus psb_xrandr_thread_create(VADriverContextP ctx)
7862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
7872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pthread_t id;
7884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_DRIVER_DATA;
7892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
7904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_info->psb_exit_atom = XInternAtom(psb_xrandr_info->dpy, "psb_exit_atom", 0);
7914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_create(&id, NULL, (void*)psb_xrandr_thread, ctx);
7922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    driver_data->xrandr_thread_id = id;
7932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return VA_STATUS_SUCCESS;
7942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
7952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
7962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei JiangVAStatus psb_xrandr_deinit()
7972f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
798f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef _FOR_FPGA_
799f31d5416a60f83e184b0906a7ec77ba021840531hding    return VA_STATUS_SUCCESS;
800f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
8014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex);
802643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //free crtc
803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_xrandr_info->crtc_head) {
804dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while (psb_xrandr_info->crtc_head) {
805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->crtc_tail = psb_xrandr_info->crtc_head->next;
806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(psb_xrandr_info->crtc_head);
808643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail;
810dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail = NULL;
812643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
813643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
814643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //free output
815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_xrandr_info->output_head) {
816dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while (psb_xrandr_info->output_head) {
817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_tail = psb_xrandr_info->output_head->next;
818dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(psb_xrandr_info->output_head);
820643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
821dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_xrandr_info->output_head = psb_xrandr_info->output_tail;
822dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
823dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_xrandr_info->output_head = psb_xrandr_info->output_tail = NULL;
824643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
825643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
8264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (psb_xrandr_info->hdmi_extvideo_prop) {
827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(psb_xrandr_info->hdmi_extvideo_prop);
8284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
829643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
8304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex);
8314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_destroy(&psb_xrandr_info->psb_extvideo_mutex);
8322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
833dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    free(psb_xrandr_info);
8342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return VA_STATUS_SUCCESS;
835643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
836643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
837dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_xrandr_init(VADriverContextP ctx)
838643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
839bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    int major, minor;
8402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    int screen;
841643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
8424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_info = (psb_xrandr_info_p)calloc(1, sizeof(psb_xrandr_info_s));
843dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!psb_xrandr_info) {
845c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "output of memory\n");
8464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        return VA_STATUS_ERROR_UNKNOWN;
8474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
8484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(psb_xrandr_info, 0, sizeof(psb_xrandr_info_s));
849dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_xrandr_info->mipi0_rotation = RR_Rotate_0;
850dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_xrandr_info->mipi1_rotation = RR_Rotate_0;
851dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_xrandr_info->hdmi_rotation = RR_Rotate_0;
852dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
853dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_xrandr_info->hdmi_extvideo_prop = (psb_extvideo_prop_p)calloc(1, sizeof(psb_extvideo_prop_s));
854dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!psb_xrandr_info->hdmi_extvideo_prop) {
855c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "output of memory\n");
856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_ALLOCATION_FAILED;
857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    memset(psb_xrandr_info->hdmi_extvideo_prop, 0, sizeof(psb_extvideo_prop_s));
8594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_info->dpy = (Display *)ctx->native_dpy;
861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    screen = DefaultScreen(psb_xrandr_info->dpy);
862643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
863dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (screen >= ScreenCount(psb_xrandr_info->dpy)) {
864c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: Invalid screen number %d (display has %d)\n",
865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           screen, ScreenCount(psb_xrandr_info->dpy));
866dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
867643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
868643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_xrandr_info->root = RootWindow(psb_xrandr_info->dpy, screen);
870643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!XRRQueryVersion(psb_xrandr_info->dpy, &major, &minor)) {
872c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: RandR extension missing\n");
873dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
874643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
875643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
876dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_xrandr_info->res = XRRGetScreenResources(psb_xrandr_info->dpy, psb_xrandr_info->root);
8774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (!psb_xrandr_info->res)
878c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Xrandr: failed to get screen resources\n");
879643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
8804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pthread_mutex_init(&psb_xrandr_info->psb_extvideo_mutex, NULL);
881643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
8824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_xrandr_refresh(ctx);
8832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
8844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return VA_STATUS_SUCCESS;
885643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
886