1 /*
2  * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sub license, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial portions
15  * of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  *
25  *
26  * Author: Alan Hourihane <alanh@tungstengraphics.com>
27  * Author: Jakob Bornecrantz <wallbraker@gmail.com>
28  *
29  */
30 
31 #ifndef _XORG_TRACKER_H_
32 #define _XORG_TRACKER_H_
33 
34 #include <stddef.h>
35 #include <stdint.h>
36 #include <errno.h>
37 #include <drm.h>
38 #include <xf86drm.h>
39 #include <xf86drmMode.h>
40 #include <xorg-server.h>
41 #include <xf86.h>
42 #include "xf86Crtc.h"
43 #include <exa.h>
44 
45 #ifdef DRM_MODE_FEATURE_DIRTYFB
46 #include <damage.h>
47 #endif
48 
49 /* Prevent symbol clash */
50 #undef Absolute
51 
52 #include "compat-api.h"
53 #include "pipe/p_screen.h"
54 #include "util/u_inlines.h"
55 #include "util/u_debug.h"
56 
57 #define DRV_ERROR(msg)	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, msg);
58 
59 struct kms_bo;
60 struct kms_driver;
61 struct exa_context;
62 
63 typedef struct
64 {
65     int lastInstance;
66     int refCount;
67     ScrnInfoPtr pScrn_1;
68     ScrnInfoPtr pScrn_2;
69 } EntRec, *EntPtr;
70 
71 #define XORG_NR_FENCES 3
72 
73 enum xorg_throttling_reason {
74     THROTTLE_RENDER,
75     THROTTLE_SWAP
76 };
77 
78 typedef struct _CustomizerRec
79 {
80     Bool dirty_throttling;
81     Bool swap_throttling;
82     Bool no_3d;
83     Bool unhidden_hw_cursor_update;
84     Bool (*winsys_pre_init) (struct _CustomizerRec *cust, int fd);
85     Bool (*winsys_screen_init)(struct _CustomizerRec *cust);
86     Bool (*winsys_screen_close)(struct _CustomizerRec *cust);
87     Bool (*winsys_enter_vt)(struct _CustomizerRec *cust);
88     Bool (*winsys_leave_vt)(struct _CustomizerRec *cust);
89     void (*winsys_context_throttle)(struct _CustomizerRec *cust,
90 				    struct pipe_context *pipe,
91 				    enum xorg_throttling_reason reason);
92     Bool (*winsys_check_fb_size) (struct _CustomizerRec *cust,
93 				  unsigned long pitch,
94 				  unsigned long height);
95 } CustomizerRec, *CustomizerPtr;
96 
97 typedef struct _modesettingRec
98 {
99     /* drm */
100     int fd;
101     unsigned fb_id;
102 
103     /* X */
104     EntPtr entityPrivate;
105 
106     int Chipset;
107     EntityInfoPtr pEnt;
108     struct pci_device *PciInfo;
109 
110     Bool noAccel;
111     Bool SWCursor;
112     CursorPtr cursor;
113     Bool swapThrottling;
114     Bool dirtyThrottling;
115     CloseScreenProcPtr CloseScreen;
116     Bool no3D;
117     Bool from_3D;
118     Bool isMaster;
119 
120     /* Broken-out options. */
121     OptionInfoPtr Options;
122 
123     void (*blockHandler)(BLOCKHANDLER_ARGS_DECL);
124     struct pipe_fence_handle *fence[XORG_NR_FENCES];
125 
126     CreateScreenResourcesProcPtr createScreenResources;
127 
128     /* for frontbuffer backing store */
129     Bool (*destroy_front_buffer)(ScrnInfoPtr pScrn);
130     Bool (*create_front_buffer)(ScrnInfoPtr pScrn);
131     Bool (*bind_front_buffer)(ScrnInfoPtr pScrn);
132 
133     /* kms */
134     struct kms_driver *kms;
135     struct kms_bo *root_bo;
136     uint16_t lut_r[256], lut_g[256], lut_b[256];
137 
138     /* gallium */
139     struct pipe_screen *screen;
140     struct pipe_context *ctx;
141     boolean d_depth_bits_last;
142     boolean ds_depth_bits_last;
143     struct pipe_resource *root_texture;
144 
145     /* exa */
146     struct exa_context *exa;
147     Bool noEvict;
148     Bool accelerate_2d;
149     Bool debug_fallback;
150 
151     CustomizerPtr cust;
152 
153 #ifdef DRM_MODE_FEATURE_DIRTYFB
154     DamagePtr damage;
155 #endif
156 } modesettingRec, *modesettingPtr;
157 
158 #define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate))
159 
160 CustomizerPtr xorg_customizer(ScrnInfoPtr pScrn);
161 
162 Bool xorg_has_gallium(ScrnInfoPtr pScrn);
163 
164 void xorg_flush(ScreenPtr pScreen);
165 /***********************************************************************
166  * xorg_exa.c
167  */
168 struct pipe_resource *
169 xorg_exa_get_texture(PixmapPtr pPixmap);
170 
171 int
172 xorg_exa_set_displayed_usage(PixmapPtr pPixmap);
173 
174 int
175 xorg_exa_set_shared_usage(PixmapPtr pPixmap);
176 
177 Bool
178 xorg_exa_set_texture(PixmapPtr pPixmap, struct  pipe_resource *tex);
179 
180 struct pipe_resource *
181 xorg_exa_create_root_texture(ScrnInfoPtr pScrn,
182 			     int width, int height,
183 			     int depth, int bpp);
184 
185 void *
186 xorg_exa_init(ScrnInfoPtr pScrn, Bool accel);
187 
188 void
189 xorg_exa_close(ScrnInfoPtr pScrn);
190 
191 
192 /***********************************************************************
193  * xorg_dri2.c
194  */
195 Bool
196 xorg_dri2_init(ScreenPtr pScreen);
197 
198 void
199 xorg_dri2_close(ScreenPtr pScreen);
200 
201 
202 /***********************************************************************
203  * xorg_crtc.c
204  */
205 void
206 xorg_crtc_init(ScrnInfoPtr pScrn);
207 
208 void
209 xorg_crtc_cursor_destroy(xf86CrtcPtr crtc);
210 
211 
212 /***********************************************************************
213  * xorg_output.c
214  */
215 void
216 xorg_output_init(ScrnInfoPtr pScrn);
217 
218 unsigned
219 xorg_output_get_id(xf86OutputPtr output);
220 
221 
222 /***********************************************************************
223  * xorg_xv.c
224  */
225 void
226 xorg_xv_init(ScreenPtr pScreen);
227 
228 
229 /***********************************************************************
230  * xorg_xvmc.c
231  */
232 void
233 xorg_xvmc_init(ScreenPtr pScreen, char *name);
234 
235 
236 #endif /* _XORG_TRACKER_H_ */
237