1 /*
2  * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sub license, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial portions
14  * of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *    Jason Hu  <jason.hu@intel.com>
26  *    Zhaohan Ren  <zhaohan.ren@intel.com>
27  *
28  */
29 
30 
31 #ifndef _PSB_XRANDR_H_
32 #define _PSB_XRANDR_H_
33 #include <stdio.h>
34 #include <X11/Xlib.h>
35 #include <X11/Xlibint.h>
36 #include <X11/Xproto.h>
37 #include <X11/Xatom.h>
38 #include <X11/extensions/Xrandr.h>
39 #include <X11/extensions/Xrender.h>     /* we share subpixel information */
40 #include <pthread.h>
41 #include <string.h>
42 #include <stdlib.h>
43 #include <stdarg.h>
44 #include <math.h>
45 #include <va/va_backend.h>
46 
47 typedef enum _psb_output_device {
48     MIPI0,
49     MIPI1,
50     LVDS0,
51     HDMI,
52 } psb_output_device;
53 
54 typedef enum _psb_output_device_mode {
55     SINGLE_MIPI0,
56     SINGLE_MIPI1,
57     SINGLE_HDMI,
58     SINGLE_LVDS0,
59     MIPI0_MIPI1,
60     MIPI0_HDMI,
61     MIPI0_MIPI1_HDMI,
62     MIPI1_HDMI,
63 } psb_output_device_mode;
64 
65 typedef enum _psb_hdmi_mode {
66     CLONE,
67     EXTENDED,
68     EXTENDEDVIDEO,
69     SINGLE,
70     UNKNOWNVIDEOMODE,
71 } psb_hdmi_mode;
72 
73 typedef enum _psb_extvideo_center {
74     NOCENTER,
75     CENTER,
76     UNKNOWNCENTER,
77 } psb_extvideo_center;
78 
79 typedef enum _psb_extvideo_subtitle {
80     BOTH,
81     ONLY_HDMI,
82     NOSUBTITLE,
83 } psb_extvideo_subtitle;
84 
85 typedef enum _psb_xrandr_location {
86     NORMAL, ABOVE, BELOW, LEFT_OF, RIGHT_OF,
87 } psb_xrandr_location;
88 
89 typedef struct _psb_extvideo_prop_s {
90     psb_hdmi_mode ExtVideoMode;
91     psb_hdmi_mode ExtDesktopMode;
92 
93     unsigned int ExtVideoMode_XRes;
94     unsigned int ExtVideoMode_YRes;
95     unsigned int ExtVideoMode_X_Offset;
96     unsigned int ExtVideoMode_Y_Offset;
97     unsigned int OverscanMode;
98     unsigned int PANELFITTING;
99 
100     psb_extvideo_center ExtVideoMode_Center;
101     psb_extvideo_subtitle ExtVideoMode_SubTitle;
102 
103 } psb_extvideo_prop_s, *psb_extvideo_prop_p;
104 
105 typedef struct _psb_xrandr_crtc_s {
106     struct _psb_xrandr_crtc_s *next;
107 
108     RRCrtc crtc_id;
109     RRMode crtc_mode;
110 
111     unsigned int width;
112     unsigned int height;
113     unsigned int x;
114     unsigned int y;
115 
116     Rotation rotation;
117     psb_xrandr_location location;
118 
119     int noutput;
120 
121 } psb_xrandr_crtc_s, *psb_xrandr_crtc_p;
122 
123 typedef struct _psb_xrandr_output_s {
124     RROutput output_id;
125     char name[10];
126     struct _psb_xrandr_output_s *next;
127 
128     Connection connection;
129 
130     psb_xrandr_crtc_p crtc;
131 
132 } psb_xrandr_output_s, *psb_xrandr_output_p;
133 
134 typedef struct _psb_xrandr_info_s {
135     psb_xrandr_crtc_p local_crtc[2];
136     psb_xrandr_crtc_p extend_crtc;
137 
138     psb_xrandr_output_p local_output[2];
139     psb_xrandr_output_p extend_output;
140 
141     unsigned int nconnected_output;
142 
143     psb_extvideo_prop_p hdmi_extvideo_prop;
144 
145     int lvds0_enabled;
146     int mipi0_enabled;
147     int mipi1_enabled;
148     int hdmi_enabled;
149 
150     Rotation mipi0_rotation;
151     Rotation mipi1_rotation;
152     Rotation hdmi_rotation;
153 
154     int output_changed;
155     psb_output_device_mode output_device_mode;
156 
157     psb_xrandr_crtc_p crtc_head, crtc_tail;
158     psb_xrandr_output_p output_head, output_tail;
159 
160     pthread_mutex_t psb_extvideo_mutex;
161     XRRScreenResources *res;
162     Display *dpy;
163     Window root;
164     Atom psb_exit_atom;
165 } psb_xrandr_info_s, *psb_xrandr_info_p;
166 
167 
168 int psb_xrandr_hdmi_enabled();
169 int psb_xrandr_mipi1_enabled();
170 int psb_xrandr_single_mode();
171 int psb_xrandr_clone_mode();
172 int psb_xrandr_extend_mode();
173 int psb_xrandr_extvideo_mode();
174 int psb_xrandr_outputchanged();
175 
176 Window psb_xrandr_create_full_screen_window(unsigned int destx, unsigned int desty, unsigned int destw, unsigned int desth);
177 VAStatus psb_xrandr_extvideo_prop(unsigned int *xres, unsigned int *yres, unsigned int *xoffset,
178                                   unsigned int *yoffset, psb_extvideo_center *center, psb_extvideo_subtitle *subtitle,
179                                   unsigned int *overscanmode, unsigned int *pannelfitting);
180 VAStatus psb_xrandr_local_crtc_coordinate(psb_output_device *local_device_enabled, int *x, int *y, int *width, int *height, Rotation *rotation);
181 VAStatus 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);
182 
183 void psb_xrandr_refresh(VADriverContextP ctx);
184 void psb_xrandr_thread();
185 VAStatus psb_xrandr_thread_create(VADriverContextP ctx);
186 VAStatus psb_xrandr_thread_exit();
187 VAStatus psb_xrandr_init(VADriverContextP ctx);
188 VAStatus psb_xrandr_deinit();
189 
190 #endif /* _PSB_XRANDR_H_ */
191