2 * Functions related to EGLDisplay.
8 #include "eglcontext.h"
9 #include "eglsurface.h"
10 #include "egldisplay.h"
11 #include "egldriver.h"
12 #include "eglglobals.h"
13 #include "eglstring.h"
19 * Finish display management.
24 _EGLDisplay
*dpyList
, *dpy
;
26 /* atexit function is called with global mutex locked */
27 dpyList
= _eglGlobal
.DisplayList
;
31 dpyList
= dpyList
->Next
;
33 if (dpy
->ContextList
|| dpy
->SurfaceList
)
34 _eglLog(_EGL_DEBUG
, "Display %p is destroyed with resources", dpy
);
38 _eglGlobal
.DisplayList
= NULL
;
43 * Allocate a new _EGLDisplay object for the given nativeDisplay handle.
44 * We'll also try to determine the device driver name at this time.
46 * Note that nativeDisplay may be an X Display ptr, or a string.
49 _eglNewDisplay(NativeDisplayType nativeDisplay
)
51 _EGLDisplay
*dpy
= (_EGLDisplay
*) calloc(1, sizeof(_EGLDisplay
));
53 dpy
->NativeDisplay
= nativeDisplay
;
54 #if defined(_EGL_PLATFORM_X)
55 dpy
->Xdpy
= (Display
*) nativeDisplay
;
58 dpy
->DriverName
= _eglPreloadDriver(dpy
);
59 if (!dpy
->DriverName
) {
69 * Link a display to itself and return the handle of the link.
70 * The handle can be passed to client directly.
73 _eglLinkDisplay(_EGLDisplay
*dpy
)
75 _eglLockMutex(_eglGlobal
.Mutex
);
77 dpy
->Next
= _eglGlobal
.DisplayList
;
78 _eglGlobal
.DisplayList
= dpy
;
80 _eglUnlockMutex(_eglGlobal
.Mutex
);
82 return (EGLDisplay
) dpy
;
87 * Unlink a linked display from itself.
88 * Accessing an unlinked display should generate EGL_BAD_DISPLAY error.
91 _eglUnlinkDisplay(_EGLDisplay
*dpy
)
95 _eglLockMutex(_eglGlobal
.Mutex
);
97 prev
= _eglGlobal
.DisplayList
;
100 if (prev
->Next
== dpy
)
105 prev
->Next
= dpy
->Next
;
108 _eglGlobal
.DisplayList
= dpy
->Next
;
111 _eglUnlockMutex(_eglGlobal
.Mutex
);
116 * Find the display corresponding to the specified native display id in all
120 _eglFindDisplay(NativeDisplayType nativeDisplay
)
124 _eglLockMutex(_eglGlobal
.Mutex
);
126 dpy
= _eglGlobal
.DisplayList
;
128 if (dpy
->NativeDisplay
== nativeDisplay
) {
129 _eglUnlockMutex(_eglGlobal
.Mutex
);
135 _eglUnlockMutex(_eglGlobal
.Mutex
);
142 * Destroy the contexts and surfaces that are linked to the display.
145 _eglReleaseDisplayResources(_EGLDriver
*drv
, _EGLDisplay
*display
)
147 _EGLContext
*contexts
;
148 _EGLSurface
*surfaces
;
150 contexts
= display
->ContextList
;
151 surfaces
= display
->SurfaceList
;
154 _EGLContext
*ctx
= contexts
;
155 contexts
= contexts
->Next
;
157 _eglUnlinkContext(ctx
);
158 drv
->API
.DestroyContext(drv
, display
, ctx
);
160 assert(!display
->ContextList
);
163 _EGLSurface
*surf
= surfaces
;
164 surfaces
= surfaces
->Next
;
166 _eglUnlinkSurface(surf
);
167 drv
->API
.DestroySurface(drv
, display
, surf
);
169 assert(!display
->SurfaceList
);
174 * Free all the data hanging of an _EGLDisplay object, but not
178 _eglCleanupDisplay(_EGLDisplay
*disp
)
183 for (i
= 0; i
< disp
->NumConfigs
; i
++)
184 free(disp
->Configs
[i
]);
186 disp
->Configs
= NULL
;
187 disp
->NumConfigs
= 0;
195 * Link a context to a display and return the handle of the link.
196 * The handle can be passed to client directly.
199 _eglLinkContext(_EGLContext
*ctx
, _EGLDisplay
*dpy
)
202 ctx
->Next
= dpy
->ContextList
;
203 dpy
->ContextList
= ctx
;
204 return (EGLContext
) ctx
;
209 * Unlink a linked context from its display.
210 * Accessing an unlinked context should generate EGL_BAD_CONTEXT error.
213 _eglUnlinkContext(_EGLContext
*ctx
)
217 prev
= ctx
->Display
->ContextList
;
220 if (prev
->Next
== ctx
)
225 prev
->Next
= ctx
->Next
;
228 ctx
->Display
->ContextList
= ctx
->Next
;
237 * Link a surface to a display and return the handle of the link.
238 * The handle can be passed to client directly.
241 _eglLinkSurface(_EGLSurface
*surf
, _EGLDisplay
*dpy
)
244 surf
->Next
= dpy
->SurfaceList
;
245 dpy
->SurfaceList
= surf
;
246 return (EGLSurface
) surf
;
251 * Unlink a linked surface from its display.
252 * Accessing an unlinked surface should generate EGL_BAD_SURFACE error.
255 _eglUnlinkSurface(_EGLSurface
*surf
)
259 prev
= surf
->Display
->SurfaceList
;
262 if (prev
->Next
== surf
)
267 prev
->Next
= surf
->Next
;
271 surf
->Display
->SurfaceList
= surf
->Next
;
275 surf
->Display
= NULL
;
279 #ifndef _EGL_SKIP_HANDLE_CHECK
283 * Return EGL_TRUE if the given handle is a valid handle to a display.
286 _eglCheckDisplayHandle(EGLDisplay dpy
)
290 _eglLockMutex(_eglGlobal
.Mutex
);
291 cur
= _eglGlobal
.DisplayList
;
293 if (cur
== (_EGLDisplay
*) dpy
)
297 _eglUnlockMutex(_eglGlobal
.Mutex
);
298 return (cur
!= NULL
);
303 * Return EGL_TRUE if the given handle is a valid handle to a context.
306 _eglCheckContextHandle(EGLContext ctx
, _EGLDisplay
*dpy
)
310 cur
= dpy
->ContextList
;
312 if (cur
== (_EGLContext
*) ctx
) {
313 assert(cur
->Display
== dpy
);
318 return (cur
!= NULL
);
323 * Return EGL_TRUE if the given handle is a valid handle to a surface.
326 _eglCheckSurfaceHandle(EGLSurface surf
, _EGLDisplay
*dpy
)
330 cur
= dpy
->SurfaceList
;
332 if (cur
== (_EGLSurface
*) surf
) {
333 assert(cur
->Display
== dpy
);
338 return (cur
!= NULL
);
342 #endif /* !_EGL_SKIP_HANDLE_CHECK */