Merge branch 'instanced-arrays'
[mesa.git] / src / egl / main / egldisplay.h
1 #ifndef EGLDISPLAY_INCLUDED
2 #define EGLDISPLAY_INCLUDED
3
4 #include "egltypedefs.h"
5 #include "egldefines.h"
6 #include "eglcontext.h"
7 #include "eglsurface.h"
8
9
10 /**
11 * Optional EGL extensions info.
12 */
13 struct _egl_extensions
14 {
15 EGLBoolean MESA_screen_surface;
16 EGLBoolean MESA_copy_context;
17
18 char String[_EGL_MAX_EXTENSIONS_LEN];
19 };
20
21
22 struct _egl_display
23 {
24 /* used to link displays */
25 _EGLDisplay *Next;
26
27 EGLNativeDisplayType NativeDisplay;
28
29 const char *DriverName;
30 _EGLDriver *Driver;
31 void *DriverData; /* private to driver */
32
33 int APImajor, APIminor; /**< as returned by eglInitialize() */
34 char Version[1000]; /**< initialized from APImajor/minor, DriverName */
35
36 /** Bitmask of supported APIs (EGL_xx_BIT) set by the driver during init */
37 EGLint ClientAPIsMask;
38 char ClientAPIs[1000]; /**< updated by eglQueryString */
39
40 _EGLExtensions Extensions;
41
42 int LargestPbuffer;
43
44 EGLint NumScreens;
45 _EGLScreen **Screens; /* array [NumScreens] */
46
47 EGLint MaxConfigs;
48 EGLint NumConfigs;
49 _EGLConfig **Configs; /* array [NumConfigs] of ptr to _EGLConfig */
50
51 /* lists of linked contexts and surface */
52 _EGLContext *ContextList;
53 _EGLSurface *SurfaceList;
54 };
55
56
57 extern void
58 _eglFiniDisplay(void);
59
60
61 extern char *
62 _eglSplitDisplayString(const char *dpyString, const char **args);
63
64
65 extern _EGLDisplay *
66 _eglNewDisplay(NativeDisplayType displayName);
67
68
69 extern EGLDisplay
70 _eglLinkDisplay(_EGLDisplay *dpy);
71
72
73 extern void
74 _eglUnlinkDisplay(_EGLDisplay *dpy);
75
76
77 extern _EGLDisplay *
78 _eglFindDisplay(NativeDisplayType nativeDisplay);
79
80
81 PUBLIC void
82 _eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *dpy);
83
84
85 PUBLIC void
86 _eglCleanupDisplay(_EGLDisplay *disp);
87
88
89 extern EGLContext
90 _eglLinkContext(_EGLContext *ctx, _EGLDisplay *dpy);
91
92
93 extern void
94 _eglUnlinkContext(_EGLContext *ctx);
95
96
97 extern EGLSurface
98 _eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy);
99
100
101 extern void
102 _eglUnlinkSurface(_EGLSurface *surf);
103
104
105 #ifndef _EGL_SKIP_HANDLE_CHECK
106
107
108 extern EGLBoolean
109 _eglCheckDisplayHandle(EGLDisplay dpy);
110
111
112 extern EGLBoolean
113 _eglCheckContextHandle(EGLContext ctx, _EGLDisplay *dpy);
114
115
116 extern EGLBoolean
117 _eglCheckSurfaceHandle(EGLSurface surf, _EGLDisplay *dpy);
118
119
120 #else /* !_EGL_SKIP_HANDLE_CHECK */
121
122 /* Only do a quick check. This is NOT standard compliant. */
123
124 static INLINE EGLBoolean
125 _eglCheckDisplayHandle(EGLDisplay dpy)
126 {
127 return ((_EGLDisplay *) dpy != NULL);
128 }
129
130
131 static INLINE EGLBoolean
132 _eglCheckContextHandle(EGLContext ctx, _EGLDisplay *dpy)
133 {
134 _EGLContext *c = (_EGLContext *) ctx;
135 return (dpy && c && c->Display == dpy);
136 }
137
138
139 static INLINE EGLBoolean
140 _eglCheckSurfaceHandle(EGLSurface surf, _EGLDisplay *dpy)
141 {
142 _EGLSurface *s = (_EGLSurface *) surf;
143 return (dpy && s && s->Display == dpy);
144 }
145
146
147 #endif /* _EGL_SKIP_HANDLE_CHECK */
148
149
150 /**
151 * Lookup a handle to find the linked display.
152 * Return NULL if the handle has no corresponding linked display.
153 */
154 static INLINE _EGLDisplay *
155 _eglLookupDisplay(EGLDisplay display)
156 {
157 _EGLDisplay *dpy = (_EGLDisplay *) display;
158 if (!_eglCheckDisplayHandle(display))
159 dpy = NULL;
160 return dpy;
161 }
162
163
164 /**
165 * Return the handle of a linked display, or EGL_NO_DISPLAY.
166 */
167 static INLINE EGLDisplay
168 _eglGetDisplayHandle(_EGLDisplay *dpy)
169 {
170 return (EGLDisplay) ((dpy) ? dpy : EGL_NO_DISPLAY);
171 }
172
173
174 /**
175 * Return true if the display is linked.
176 */
177 static INLINE EGLBoolean
178 _eglIsDisplayLinked(_EGLDisplay *dpy)
179 {
180 return (EGLBoolean) (_eglGetDisplayHandle(dpy) != EGL_NO_DISPLAY);
181 }
182
183
184 /**
185 * Lookup a handle to find the linked context.
186 * Return NULL if the handle has no corresponding linked context.
187 */
188 static INLINE _EGLContext *
189 _eglLookupContext(EGLContext context, _EGLDisplay *dpy)
190 {
191 _EGLContext *ctx = (_EGLContext *) context;
192 if (!_eglCheckContextHandle(context, dpy))
193 ctx = NULL;
194 return ctx;
195 }
196
197
198 /**
199 * Return the handle of a linked context, or EGL_NO_CONTEXT.
200 */
201 static INLINE EGLContext
202 _eglGetContextHandle(_EGLContext *ctx)
203 {
204 return (EGLContext) ((ctx && ctx->Display) ? ctx : EGL_NO_CONTEXT);
205 }
206
207
208 /**
209 * Return true if the context is linked to a display.
210 */
211 static INLINE EGLBoolean
212 _eglIsContextLinked(_EGLContext *ctx)
213 {
214 return (EGLBoolean) (_eglGetContextHandle(ctx) != EGL_NO_CONTEXT);
215 }
216
217
218 /**
219 * Lookup a handle to find the linked surface.
220 * Return NULL if the handle has no corresponding linked surface.
221 */
222 static INLINE _EGLSurface *
223 _eglLookupSurface(EGLSurface surface, _EGLDisplay *dpy)
224 {
225 _EGLSurface *surf = (_EGLSurface *) surface;
226 if (!_eglCheckSurfaceHandle(surf, dpy))
227 surf = NULL;
228 return surf;
229 }
230
231
232 /**
233 * Return the handle of a linked surface, or EGL_NO_SURFACE.
234 */
235 static INLINE EGLSurface
236 _eglGetSurfaceHandle(_EGLSurface *surf)
237 {
238 return (EGLSurface) ((surf && surf->Display) ? surf : EGL_NO_SURFACE);
239 }
240
241
242 /**
243 * Return true if the surface is linked to a display.
244 */
245 static INLINE EGLBoolean
246 _eglIsSurfaceLinked(_EGLSurface *surf)
247 {
248 return (EGLBoolean) (_eglGetSurfaceHandle(surf) != EGL_NO_SURFACE);
249 }
250
251
252 /**
253 * Cast an unsigned int to a pointer.
254 */
255 static INLINE void *
256 _eglUIntToPointer(unsigned int v)
257 {
258 return (void *) ((uintptr_t) v);
259 }
260
261
262 /**
263 * Cast a pointer to an unsigned int. The pointer must be one that is
264 * returned by _eglUIntToPointer.
265 */
266 static INLINE unsigned int
267 _eglPointerToUInt(const void *p)
268 {
269 return (unsigned int) ((uintptr_t) p);
270 }
271
272
273 #endif /* EGLDISPLAY_INCLUDED */