psb_xrandr.c revision 3f3d1e8746d2b793c982ac19a73061e006b1b178
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" 33643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Global variable for xrandr */ 35643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangpsb_xrandr_info_p psb_xrandr_info; 364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData 38dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#define INIT_OUTPUT_PRIV psb_x11_output_p output = (psb_x11_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv) 39643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 40643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#define MWM_HINTS_DECORATIONS (1L << 1) 41dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef struct { 42dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int flags; 43dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int functions; 44dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int decorations; 45dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int input_mode; 46dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int status; 47643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} MWMHints; 48643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangchar* location2string(psb_xrandr_location location) 50643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 51dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (location) { 52dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case ABOVE: 53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return "ABOVE"; 54dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 55dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case BELOW: 56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return "BELOW"; 57dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 58dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case LEFT_OF: 59dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return "LEFT_OF"; 60dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case RIGHT_OF: 62dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return "RIGHT_OF"; 63dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 65dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return "NORMAL"; 66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 67643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 68643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 69643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic int RRrotation2VArotation(Rotation rotation) 71643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo switch (rotation) { 73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case RR_Rotate_0: 74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_ROTATION_NONE; 75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case RR_Rotate_90: 76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_ROTATION_270; 77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case RR_Rotate_180: 78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_ROTATION_180; 79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case RR_Rotate_270: 80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_ROTATION_90; 81643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 0; 84643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 85643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic psb_xrandr_crtc_p get_crtc_by_id(RRCrtc crtc_id) 86643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 87643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang psb_xrandr_crtc_p p_crtc; 884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo for (p_crtc = psb_xrandr_info->crtc_head; p_crtc; p_crtc = p_crtc->next) 89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_crtc->crtc_id == crtc_id) 90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return p_crtc; 91643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return NULL; 92643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 93643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_xrandr_hdmi_property(VADriverContextP ctx) 95643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun INIT_DRIVER_DATA; 97643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang Atom *props; 98643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang Atom actual_type; 994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XRRPropertyInfo *propinfo; 1004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int i, nprop, actual_format; 1014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned long nitems, bytes_after; 1024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo char* prop_name; 103643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang unsigned char* prop; 104643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Check HDMI properties */ 106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun props = XRRListOutputProperties(psb_xrandr_info->dpy, psb_xrandr_info->extend_output->output_id, &nprop); 107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!props) { 108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: XRRListOutputProperties failed\n", psb_xrandr_info->extend_output->output_id); 109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: extend output %08x has %d properties\n", psb_xrandr_info->extend_output->output_id, nprop); 113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < nprop; i++) { 115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XRRGetOutputProperty(psb_xrandr_info->dpy, psb_xrandr_info->extend_output->output_id, props[i], 116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 100, False, False, AnyPropertyType, &actual_type, &actual_format, 117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &nitems, &bytes_after, &prop); 118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun propinfo = XRRQueryOutputProperty(psb_xrandr_info->dpy, psb_xrandr_info->extend_output->output_id, props[i]); 120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!propinfo) { 121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: get output %08x prop %08x failed\n", psb_xrandr_info->extend_output->output_id, props[i]); 122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun prop_name = XGetAtomName(psb_xrandr_info->dpy, props[i]); 126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Currently all properties are XA_INTEGER, 32 */ 128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!strcmp(prop_name, "ExtVideoMode")) { 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode = (int)((INT32*)prop)[0]; 130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtVideoMode (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode); 131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "ExtVideoMode_Xres")) { 132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes = (int)((INT32*)prop)[0]; 133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtVideoMode_XRes (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes); 134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "ExtVideoMode_Yres")) { 135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes = (int)((INT32*)prop)[0]; 136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtVideoMode_YRes (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes); 137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "ExtVideoMode_X_Offset")) { 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset = (int)((INT32*)prop)[0]; 139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtVideoMode_X_Offset (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset); 140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "ExtVideoMode_Y_Offset")) { 141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset = (int)((INT32*)prop)[0]; 142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtVideoMode_Y_Offset (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset); 143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "ExtVideoMode_Center")) { 144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center = (int)((INT32*)prop)[0]; 145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtVideoMode_Center (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center); 146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "ExtVideoMode_SubTitle")) { 147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle = (int)((INT32*)prop)[0]; 148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtVideoMode_SubTitle (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle); 149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "ExtDesktopMode")) { 150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode != EXTENDEDVIDEO) && 151bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((int)((INT32*)prop)[0] == EXTENDEDVIDEO)) { 152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->xrandr_dirty |= PSB_NEW_EXTVIDEO; 153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = (int)((INT32*)prop)[0]; 155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: ExtDesktopMode (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode); 156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "OverscanMode")) { 157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->OverscanMode = (int)((INT32*)prop)[0]; 158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: OverscanMode (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->OverscanMode); 159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(prop_name, "PANELFITTING")) { 160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->PANELFITTING = (int)((INT32*)prop)[0]; 161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: PANELFITTING (%08x)\n", psb_xrandr_info->hdmi_extvideo_prop->PANELFITTING); 162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 165643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 1664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_xrandr_mipi_location_init(psb_output_device_mode output_device_mode) 1674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 1680da1930627209986e8db220799a690f816494401Austin Yuan psb_xrandr_crtc_p local_crtc = NULL, extend_crtc = NULL; 1694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo switch (output_device_mode) { 171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case SINGLE_MIPI0: 172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE; 173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[0]->location = NORMAL; 174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case SINGLE_MIPI1: 176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE; 177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[1]->location = NORMAL; 178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_MIPI1: 180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_crtc = psb_xrandr_info->local_crtc[0]; 181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc = psb_xrandr_info->local_crtc[1]; 182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 186643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 1874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!local_crtc || !extend_crtc) { 188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Failed to get crtc info\n"); 189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 1904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 191643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 1924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* MIPI1 clone MIPI0 */ 1934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (local_crtc->x == 0 && local_crtc->y == 0 && 194bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang extend_crtc->x == 0 && extend_crtc->y == 0) { 195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = CLONE; 196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc->location = NORMAL; 1974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else { 198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* MIPI1 entend MIPI0 */ 199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = EXTENDED; 200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (local_crtc->y == extend_crtc->height) 201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc->location = ABOVE; 2024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else if (extend_crtc->y == local_crtc->height) 203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc->location = BELOW; 2044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else if (local_crtc->x == extend_crtc->width) 205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc->location = LEFT_OF; 2064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else if (extend_crtc->x == local_crtc->width) 207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc->location = RIGHT_OF; 2084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 2094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 2104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_xrandr_hdmi_location_init(psb_output_device_mode output_device_mode) 2124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 2130da1930627209986e8db220799a690f816494401Austin Yuan psb_xrandr_crtc_p local_crtc = NULL, extend_crtc = NULL; 214643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 2154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo switch (output_device_mode) { 216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case SINGLE_HDMI: 217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE; 218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc->location = NORMAL; 219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_HDMI: 221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_MIPI1_HDMI: 222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_crtc = psb_xrandr_info->local_crtc[0]; 223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc = psb_xrandr_info->extend_crtc; 224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI1_HDMI: 226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun local_crtc = psb_xrandr_info->local_crtc[1]; 227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun extend_crtc = psb_xrandr_info->extend_crtc; 228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 2314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 2324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!local_crtc || !extend_crtc) { 234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Failed to get crtc info\n"); 235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 2364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == CLONE) 239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc->location = NORMAL; 2404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDED 242bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang || psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDEDVIDEO) { 243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (local_crtc->y == extend_crtc->height) 244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc->location = ABOVE; 245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (extend_crtc->y == local_crtc->height) 246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc->location = BELOW; 247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (local_crtc->x == extend_crtc->width) 248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc->location = LEFT_OF; 249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (extend_crtc->x == local_crtc->width) 250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc->location = RIGHT_OF; 2514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 2524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 2534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb_xrandr_coordinate_init(VADriverContextP ctx) 2554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 2564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 2574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_output_p p_output; 2584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_info->output_changed = 1; 2604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo for (p_output = psb_xrandr_info->output_head; p_output; p_output = p_output->next) { 262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_output->connection == RR_Connected) { 263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!strcmp(p_output->name, "MIPI0")) { 264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_output->crtc) { 265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi0_enabled = 1; 266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_output[0] = p_output; 267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[0] = p_output->crtc; 268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->mipi0_rotation != p_output->crtc->rotation) { 269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi0_rotation = p_output->crtc->rotation; 270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->mipi0_rotation = RRrotation2VArotation(psb_xrandr_info->mipi0_rotation); 271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->xrandr_dirty |= PSB_NEW_ROTATION; 272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi0_enabled = 0; 275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_output[0] = NULL; 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[0] = NULL; 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(p_output->name, "MIPI1")) { 279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_output->crtc) { 280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi1_enabled = 1; 281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_output[1] = p_output; 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[1] = p_output->crtc; 283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->mipi1_rotation != p_output->crtc->rotation) { 284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi1_rotation = p_output->crtc->rotation; 285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->mipi1_rotation = RRrotation2VArotation(psb_xrandr_info->mipi1_rotation); 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->xrandr_dirty |= PSB_NEW_ROTATION; 287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi1_enabled = 0; 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_output[1] = NULL; 291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[1] = NULL; 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(p_output->name, "TMDS0-1")) { 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_output->crtc) { 295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_enabled = 1; 296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_output = p_output; 297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc = p_output->crtc; 298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->hdmi_rotation != p_output->crtc->rotation) { 299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_rotation = p_output->crtc->rotation; 300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->hdmi_rotation = RRrotation2VArotation(psb_xrandr_info->hdmi_rotation); 301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->xrandr_dirty |= PSB_NEW_ROTATION; 302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_enabled = 0; 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_output = NULL; 306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->extend_crtc = NULL; 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else if (!strcmp(p_output->name, "LVDS0") && IS_MRST(driver_data)) { 309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_output->crtc) { 310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->lvds0_enabled = 1; 311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_output[0] = p_output; 312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[0] = p_output->crtc; 313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->lvds0_enabled = 0; 315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_output[0] = NULL; 316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[0] = NULL; 317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 3204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 3214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 3224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* for MRST */ 3234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (IS_MRST(driver_data) && psb_xrandr_info->lvds0_enabled) { 324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode = SINGLE; 325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = SINGLE_LVDS0; 326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->local_crtc[0]->location = NORMAL; 327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 3284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 3294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 3304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* HDMI + either MIPI0 or MIPI1 */ 3314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_info->hdmi_enabled) { 3324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Get HDMI properties if it is enabled*/ 334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_hdmi_property(ctx); 3354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Only HDMI */ 337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!psb_xrandr_info->mipi0_enabled && !psb_xrandr_info->mipi1_enabled) 338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = SINGLE_HDMI; 3394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* HDMI + MIPI0 */ 341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->mipi0_enabled && !psb_xrandr_info->mipi1_enabled) 342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = MIPI0_HDMI; 3434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* HDMI + MIPI1 */ 345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!psb_xrandr_info->mipi0_enabled && psb_xrandr_info->mipi1_enabled) 346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = MIPI1_HDMI; 3474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* HDMI + MIPI0 + MIPI1 */ 349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->mipi0_enabled && psb_xrandr_info->mipi1_enabled) 350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = MIPI0_MIPI1_HDMI; 3514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_hdmi_location_init(psb_xrandr_info->output_device_mode); 3534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else { 354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* MIPI0 + MIPI1 */ 355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->mipi0_enabled && psb_xrandr_info->mipi1_enabled) { 356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = MIPI0_MIPI1; 357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* MIPI0/MIPI1 */ 359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->mipi0_enabled) 360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = SINGLE_MIPI0; 361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else if (psb_xrandr_info->mipi1_enabled) 362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_device_mode = SINGLE_MIPI1; 363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_mipi_location_init(psb_xrandr_info->output_device_mode); 366643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 367643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 368643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 3694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_xrandr_refresh(VADriverContextP ctx) 370643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 3714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int i; 372643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 373643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang XRROutputInfo *output_info; 374643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang XRRCrtcInfo *crtc_info; 375643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 376643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang psb_xrandr_crtc_p p_crtc; 377643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang psb_xrandr_output_p p_output; 378643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 3794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 380643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun //deinit crtc 382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->crtc_head) { 383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (psb_xrandr_info->crtc_head) { 384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_tail = psb_xrandr_info->crtc_head->next; 385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(psb_xrandr_info->crtc_head); 387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail; 389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail = NULL; 3914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 392643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < psb_xrandr_info->res->ncrtc; i++) { 394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun crtc_info = XRRGetCrtcInfo(psb_xrandr_info->dpy, psb_xrandr_info->res, psb_xrandr_info->res->crtcs[i]); 395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (crtc_info) { 396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc = (psb_xrandr_crtc_p)calloc(1, sizeof(psb_xrandr_crtc_s)); 397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!p_crtc) { 398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("output of memory\n"); 3994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return; 4004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 401643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i == 0) 403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail = p_crtc; 404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->crtc_id = psb_xrandr_info->res->crtcs[i]; 406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->x = crtc_info->x; 407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->y = crtc_info->y; 408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->width = crtc_info->width; 409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->height = crtc_info->height; 410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->crtc_mode = crtc_info->mode; 411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->noutput = crtc_info->noutput; 412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->rotation = crtc_info->rotation; 413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_tail->next = p_crtc; 415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc->next = NULL; 416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_tail = p_crtc; 417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("failed to get crtc_info\n"); 4194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 422643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 423643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 424643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang //deinit output 425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->output_head) { 426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (psb_xrandr_info->output_head) { 427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_tail = psb_xrandr_info->output_head->next; 428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(psb_xrandr_info->output_head); 430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_head = psb_xrandr_info->output_tail; 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_head = psb_xrandr_info->output_tail = NULL; 434643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 4354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0 4364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo //destroy the full-screen window 4374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo //FIXME: commited out for X Error message: BadDrawable, need more investigation 4384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (va_output) { 439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (va_output->extend_drawable) { 440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XDestroyWindow(ctx->native_dpy, va_output->extend_drawable); 441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun va_output->extend_drawable = 0; 442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun texture_priv->extend_dri_init_flag = 0; 443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 4444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 4454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < psb_xrandr_info->res->noutput; i++) { 447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun output_info = XRRGetOutputInfo(psb_xrandr_info->dpy, psb_xrandr_info->res, psb_xrandr_info->res->outputs[i]); 448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (output_info) { 449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_output = (psb_xrandr_output_p)calloc(1, sizeof(psb_xrandr_output_s)); 450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!p_output) { 451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("output of memory\n"); 4524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return; 4534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 454643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i == 0) 456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_head = psb_xrandr_info->output_tail = p_output; 457643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_output->output_id = psb_xrandr_info->res->outputs[i]; 459643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_output->connection = output_info->connection; 461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (p_output->connection == RR_Connected) 462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->nconnected_output++; 463643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun strcpy(p_output->name, output_info->name); 465643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (output_info->crtc) 467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_output->crtc = get_crtc_by_id(output_info->crtc); 468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun else 469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_output->crtc = NULL; 470643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_tail->next = p_output; 472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_output->next = NULL; 473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_tail = p_output; 474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("failed to get output_info\n"); 476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 479643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 480643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 4814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_coordinate_init(ctx); 4820da1930627209986e8db220799a690f816494401Austin Yuan 4830da1930627209986e8db220799a690f816494401Austin Yuan psb_RecalcRotate(ctx); 4844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 485643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 486643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 487bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic Bool 488bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun WangoutputChangePredicate(Display *display, XEvent *event, char *args) 489bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang{ 490bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang int event_base, error_base; 491bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 492bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang XRRQueryExtension(psb_xrandr_info->dpy, &event_base, &error_base); 493bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return ((event->type == event_base + RRNotify_OutputChange) || 494bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ((event->type == ClientMessage) && 495bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (((XClientMessageEvent*)event)->message_type == psb_xrandr_info->psb_exit_atom))); 496bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang} 497bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 4984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_xrandr_thread(void* arg) 499643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 5004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo VADriverContextP ctx = (VADriverContextP)arg; 501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun INIT_DRIVER_DATA; 502643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int event_base, error_base; 503643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang XEvent event; 5044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XRRQueryExtension(psb_xrandr_info->dpy, &event_base, &error_base); 5054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XRRSelectInput(psb_xrandr_info->dpy, psb_xrandr_info->root, RRScreenChangeNotifyMask | RRCrtcChangeNotifyMask | RROutputChangeNotifyMask | RROutputPropertyNotifyMask); 5062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang psb__information_message("Xrandr: psb xrandr thread start\n"); 507643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (1) { 509bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (XCheckIfEvent(psb_xrandr_info->dpy, (XEvent *)&event, outputChangePredicate, NULL)) { 510bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (event.type == ClientMessage) { 511bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("Xrandr: receive ClientMessage event, thread should exit\n"); 512bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang XClientMessageEvent *evt; 513bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang evt = (XClientMessageEvent*) & event; 514bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (evt->message_type == psb_xrandr_info->psb_exit_atom) { 515bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("Xrandr: xrandr thread exit safely\n"); 516bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang pthread_exit(NULL); 517bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 518bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 519bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang switch (event.type - event_base) { 520bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case RRNotify_OutputChange: 521bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang XRRUpdateConfiguration(&event); 522bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("Xrandr: receive RRNotify_OutputChange event, refresh output/crtc info\n"); 523bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->xrandr_update = 1; 524bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb_xrandr_refresh(ctx); 525bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 526bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang default: 527bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 5282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 530bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang usleep(200000); 531643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 532643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 533643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 5344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoWindow psb_xrandr_create_full_screen_window(unsigned int destx, unsigned int desty, unsigned int destw, unsigned int desth) 535643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 536643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int x, y, width, height; 537643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang Window win; 538643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 539643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang x = psb_xrandr_info->extend_crtc->x; 540643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang y = psb_xrandr_info->extend_crtc->y; 541643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang width = psb_xrandr_info->extend_crtc->width; 542643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang height = psb_xrandr_info->extend_crtc->height; 543643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 5444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (destw == 0 || desth == 0) { 5454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo destw = width; 5464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo desth = height; 5474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 5484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo win = XCreateSimpleWindow(psb_xrandr_info->dpy, DefaultRootWindow(psb_xrandr_info->dpy), destx, desty, destw, desth, 0, 0, 0); 549643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 550643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang MWMHints mwmhints; 551643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang Atom MOTIF_WM_HINTS; 552643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 553643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang mwmhints.flags = MWM_HINTS_DECORATIONS; 554643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang mwmhints.decorations = 0; /* MWM_DECOR_BORDER */ 5554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MOTIF_WM_HINTS = XInternAtom(psb_xrandr_info->dpy, "_MOTIF_WM_HINTS", False); 556bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang XChangeProperty(psb_xrandr_info->dpy, win, MOTIF_WM_HINTS, MOTIF_WM_HINTS, sizeof(long) * 8, 557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PropModeReplace, (unsigned char*) &mwmhints, sizeof(mwmhints) / sizeof(long)); 558643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 559643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang XSetWindowAttributes attributes; 560643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang attributes.override_redirect = 1; 561643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang unsigned long valuemask; 562643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang valuemask = CWOverrideRedirect ; 5634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XChangeWindowAttributes(psb_xrandr_info->dpy, win, valuemask, &attributes); 564643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 5654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XMapWindow(psb_xrandr_info->dpy, win); 5664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFlush(psb_xrandr_info->dpy); 567643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return win; 568643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 569643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 5704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_xrandr_hdmi_enabled() 571643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 5724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int ret; 5734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 5744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = psb_xrandr_info->hdmi_enabled; 5754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 5764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return ret; 577643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 5784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 5794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_xrandr_mipi0_enabled() 580643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 581643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 5824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 5834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = psb_xrandr_info->mipi0_enabled; 5844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 585643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return ret; 586643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 587643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 5884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_xrandr_mipi1_enabled() 589643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 590643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 5914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 5924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = psb_xrandr_info->mipi1_enabled; 5934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 594643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return ret; 595643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 596643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 597643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_single_mode() 598643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 599643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 6004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 6014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == SINGLE) ? 1 : 0; 6024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 603643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return ret; 604643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 605643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 606643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_clone_mode() 607643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 608643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 6094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 6104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == CLONE) ? 1 : 0; 6114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 612643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return ret; 613643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 614643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 615643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_extend_mode() 616643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 617643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 6184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 6194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDED) ? 1 : 0; 6204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 621643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return ret; 622643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 623643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 624643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_extvideo_mode() 625643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 626643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 6274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 6284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode == EXTENDEDVIDEO) ? 1 : 0; 6294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 630643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return ret; 631643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 632643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 633643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_outputchanged() 634643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 635643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 6364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->output_changed) { 638643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang psb_xrandr_info->output_changed = 0; 639643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang ret = 1; 640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 641643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang ret = 0; 6424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 643643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return ret; 644643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 645643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_xrandr_extvideo_prop(unsigned int *xres, unsigned int *yres, unsigned int *xoffset, 647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int *yoffset, psb_extvideo_center *center, psb_extvideo_subtitle *subtitle, 648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int *overscanmode, unsigned int *pannelfitting) 649643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 6504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 651643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->hdmi_extvideo_prop->ExtDesktopMode != EXTENDEDVIDEO) { 6534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 655643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 656643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 657643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang *xres = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes; 658643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang *yres = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes; 659643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang *xoffset = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset; 660643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang *yoffset = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset; 661643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang *center = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center; 662643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang *subtitle = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle; 6634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *pannelfitting = psb_xrandr_info->hdmi_extvideo_prop->PANELFITTING; 6644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *overscanmode = psb_xrandr_info->hdmi_extvideo_prop->OverscanMode; 665643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 6664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 667643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return VA_STATUS_SUCCESS; 668643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 669643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 6704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, ShuoVAStatus psb_xrandr_local_crtc_coordinate(psb_output_device *local_device_enabled, int *x, int *y, int *width, int *height, Rotation *rotation) 671643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 6724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_crtc_p p_crtc; 6734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 6744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo switch (psb_xrandr_info->output_device_mode) { 676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case SINGLE_LVDS0: 677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *local_device_enabled = LVDS0; 678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc = psb_xrandr_info->local_crtc[0]; 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case SINGLE_MIPI0: 681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_MIPI1: 682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_HDMI: 683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_MIPI1_HDMI: 684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *local_device_enabled = MIPI0; 685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc = psb_xrandr_info->local_crtc[0]; 686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case SINGLE_MIPI1: 688dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI1_HDMI: 689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *local_device_enabled = MIPI1; 690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc = psb_xrandr_info->local_crtc[1]; 691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case SINGLE_HDMI: 693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *local_device_enabled = HDMI; 694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc = psb_xrandr_info->extend_crtc; 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: Unknown statue\n"); 698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 7014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 7024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 7034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (p_crtc) { 704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *x = p_crtc->x; 705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *y = p_crtc->y; 706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *width = p_crtc->width; 707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *height = p_crtc->height; 708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *rotation = p_crtc->rotation; 709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: device %08x enabled, crtc %08x coordinate: x = %d, y = %d, widht = %d, height = %d, rotate = %08x\n", 711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *local_device_enabled, p_crtc->crtc_id, *x, *y, *width + 1, *height + 1, *rotation); 712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_SUCCESS; 7134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else { 714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: local device is not available\n"); 715dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 717643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 718643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 719643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 7204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, 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) 721643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 7224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_crtc_p p_crtc; 723643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 7244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 7254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 7264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo switch (psb_xrandr_info->output_device_mode) { 727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_MIPI1: 728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *extend_device_enabled = MIPI1; 729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc = psb_xrandr_info->local_crtc[1]; 730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_HDMI: 732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI0_MIPI1_HDMI: 733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case MIPI1_HDMI: 734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *extend_device_enabled = HDMI; 735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_crtc = psb_xrandr_info->extend_crtc; 736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: Unknown status, may be extend device is not available\n"); 739dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 740dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 742643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 743643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 7444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (p_crtc) { 7454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *x = p_crtc->x; 7464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *y = p_crtc->y; 7474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *width = p_crtc->width; 7484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *height = p_crtc->height; 7494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *location = p_crtc->location; 7504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *rotation = p_crtc->rotation; 751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 7524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("Xrandr: extend device %08x enabled, crtc %08x coordinate: x = %d, y = %d, widht = %d, height = %d, location = %s, rotation = %08x\n", 753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *extend_device_enabled, p_crtc->crtc_id, *x, *y, *width + 1, *height + 1, location2string(p_crtc->location), *rotation); 7544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } else { 755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: extend device is not available\n"); 756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 7574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_ERROR_UNKNOWN; 7584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 760643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang return VA_STATUS_SUCCESS; 761643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 762643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_xrandr_thread_exit() 764643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 765643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang int ret; 766bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 767dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun XSelectInput(psb_xrandr_info->dpy, psb_xrandr_info->root, StructureNotifyMask); 768643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang XClientMessageEvent xevent; 769643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang xevent.type = ClientMessage; 7704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo xevent.message_type = psb_xrandr_info->psb_exit_atom; 771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun xevent.window = psb_xrandr_info->root; 772643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang xevent.format = 32; 773dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = XSendEvent(psb_xrandr_info->dpy, psb_xrandr_info->root, 0, StructureNotifyMask, (XEvent*) & xevent); 7744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo XFlush(psb_xrandr_info->dpy); 7752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang if (!ret) { 776dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: send thread exit event to drawable: failed\n"); 777dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Xrandr: send thread exit event to drawable: success\n"); 780dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_SUCCESS; 781643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 7822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 7832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 7842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei JiangVAStatus psb_xrandr_thread_create(VADriverContextP ctx) 7852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 7862f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang pthread_t id; 7874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo INIT_DRIVER_DATA; 7882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 7894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_info->psb_exit_atom = XInternAtom(psb_xrandr_info->dpy, "psb_exit_atom", 0); 7904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_create(&id, NULL, (void*)psb_xrandr_thread, ctx); 7912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang driver_data->xrandr_thread_id = id; 7922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return VA_STATUS_SUCCESS; 7932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 7942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 7952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei JiangVAStatus psb_xrandr_deinit() 7962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 7974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_lock(&psb_xrandr_info->psb_extvideo_mutex); 798643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang //free crtc 799dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->crtc_head) { 800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (psb_xrandr_info->crtc_head) { 801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_tail = psb_xrandr_info->crtc_head->next; 802dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(psb_xrandr_info->crtc_head); 804643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail; 806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->crtc_head = psb_xrandr_info->crtc_tail = NULL; 808643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 809643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 810643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang //free output 811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_xrandr_info->output_head) { 812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (psb_xrandr_info->output_head) { 813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_tail = psb_xrandr_info->output_head->next; 814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(psb_xrandr_info->output_head); 816643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_head = psb_xrandr_info->output_tail; 818dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->output_head = psb_xrandr_info->output_tail = NULL; 820643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 821643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 8224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (psb_xrandr_info->hdmi_extvideo_prop) { 823dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(psb_xrandr_info->hdmi_extvideo_prop); 8244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 825643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 8264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_unlock(&psb_xrandr_info->psb_extvideo_mutex); 8274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_destroy(&psb_xrandr_info->psb_extvideo_mutex); 8282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 829dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(psb_xrandr_info); 8302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang return VA_STATUS_SUCCESS; 831643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 832643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 833dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_xrandr_init(VADriverContextP ctx) 834643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{ 835bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang int major, minor; 8362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang int screen; 837643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 8384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_info = (psb_xrandr_info_p)calloc(1, sizeof(psb_xrandr_info_s)); 839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!psb_xrandr_info) { 8414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__error_message("output of memory\n"); 8424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_ERROR_UNKNOWN; 8434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 8444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(psb_xrandr_info, 0, sizeof(psb_xrandr_info_s)); 845dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi0_rotation = RR_Rotate_0; 846dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->mipi1_rotation = RR_Rotate_0; 847dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_rotation = RR_Rotate_0; 848dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 849dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->hdmi_extvideo_prop = (psb_extvideo_prop_p)calloc(1, sizeof(psb_extvideo_prop_s)); 850dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!psb_xrandr_info->hdmi_extvideo_prop) { 851dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("output of memory\n"); 852dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_ALLOCATION_FAILED; 853dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 854dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(psb_xrandr_info->hdmi_extvideo_prop, 0, sizeof(psb_extvideo_prop_s)); 8554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_info->dpy = (Display *)ctx->native_dpy; 857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun screen = DefaultScreen(psb_xrandr_info->dpy); 858643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (screen >= ScreenCount(psb_xrandr_info->dpy)) { 860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: Invalid screen number %d (display has %d)\n", 861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun screen, ScreenCount(psb_xrandr_info->dpy)); 862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 863643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 864643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->root = RootWindow(psb_xrandr_info->dpy, screen); 866643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 867dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!XRRQueryVersion(psb_xrandr_info->dpy, &major, &minor)) { 868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: RandR extension missing\n"); 869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 870643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang } 871643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 872dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_xrandr_info->res = XRRGetScreenResources(psb_xrandr_info->dpy, psb_xrandr_info->root); 8734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if (!psb_xrandr_info->res) 874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("Xrandr: failed to get screen resources\n"); 875643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 8764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo pthread_mutex_init(&psb_xrandr_info->psb_extvideo_mutex, NULL); 877643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 8784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_xrandr_refresh(ctx); 8792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 8804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return VA_STATUS_SUCCESS; 881643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} 882