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