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"
14 #include "eglstring.h"
20 * Finish display management.
25 _EGLDisplay
*dpyList
, *dpy
;
27 /* atexit function is called with global mutex locked */
28 dpyList
= _eglGlobal
.DisplayList
;
32 dpyList
= dpyList
->Next
;
34 if (dpy
->ContextList
|| dpy
->SurfaceList
)
35 _eglLog(_EGL_DEBUG
, "Display %p is destroyed with resources", dpy
);
39 _eglGlobal
.DisplayList
= NULL
;
44 * Allocate a new _EGLDisplay object for the given nativeDisplay handle.
45 * We'll also try to determine the device driver name at this time.
47 * Note that nativeDisplay may be an X Display ptr, or a string.
50 _eglNewDisplay(NativeDisplayType nativeDisplay
)
52 _EGLDisplay
*dpy
= (_EGLDisplay
*) calloc(1, sizeof(_EGLDisplay
));
54 dpy
->NativeDisplay
= nativeDisplay
;
55 #if defined(_EGL_PLATFORM_X)
56 dpy
->Xdpy
= (Display
*) nativeDisplay
;
59 dpy
->DriverName
= _eglPreloadDriver(dpy
);
60 if (!dpy
->DriverName
) {
70 * Link a display to itself and return the handle of the link.
71 * The handle can be passed to client directly.
74 _eglLinkDisplay(_EGLDisplay
*dpy
)
76 _eglLockMutex(_eglGlobal
.Mutex
);
78 dpy
->Next
= _eglGlobal
.DisplayList
;
79 _eglGlobal
.DisplayList
= dpy
;
81 _eglUnlockMutex(_eglGlobal
.Mutex
);
83 return (EGLDisplay
) dpy
;
88 * Unlink a linked display from itself.
89 * Accessing an unlinked display should generate EGL_BAD_DISPLAY error.
92 _eglUnlinkDisplay(_EGLDisplay
*dpy
)
96 _eglLockMutex(_eglGlobal
.Mutex
);
98 prev
= _eglGlobal
.DisplayList
;
101 if (prev
->Next
== dpy
)
106 prev
->Next
= dpy
->Next
;
109 _eglGlobal
.DisplayList
= dpy
->Next
;
112 _eglUnlockMutex(_eglGlobal
.Mutex
);
117 * Find the display corresponding to the specified native display id in all
121 _eglFindDisplay(NativeDisplayType nativeDisplay
)
125 _eglLockMutex(_eglGlobal
.Mutex
);
127 dpy
= _eglGlobal
.DisplayList
;
129 if (dpy
->NativeDisplay
== nativeDisplay
) {
130 _eglUnlockMutex(_eglGlobal
.Mutex
);
136 _eglUnlockMutex(_eglGlobal
.Mutex
);
143 * Destroy the contexts and surfaces that are linked to the display.
146 _eglReleaseDisplayResources(_EGLDriver
*drv
, _EGLDisplay
*display
)
148 _EGLContext
*contexts
;
149 _EGLSurface
*surfaces
;
151 contexts
= display
->ContextList
;
152 surfaces
= display
->SurfaceList
;
155 _EGLContext
*ctx
= contexts
;
156 contexts
= contexts
->Next
;
158 _eglUnlinkContext(ctx
);
159 drv
->API
.DestroyContext(drv
, display
, ctx
);
161 assert(!display
->ContextList
);
164 _EGLSurface
*surf
= surfaces
;
165 surfaces
= surfaces
->Next
;
167 _eglUnlinkSurface(surf
);
168 drv
->API
.DestroySurface(drv
, display
, surf
);
170 assert(!display
->SurfaceList
);
175 * Free all the data hanging of an _EGLDisplay object, but not
179 _eglCleanupDisplay(_EGLDisplay
*disp
)
184 for (i
= 0; i
< disp
->NumConfigs
; i
++)
185 free(disp
->Configs
[i
]);
187 disp
->Configs
= NULL
;
188 disp
->NumConfigs
= 0;
196 * Link a context to a display and return the handle of the link.
197 * The handle can be passed to client directly.
200 _eglLinkContext(_EGLContext
*ctx
, _EGLDisplay
*dpy
)
203 ctx
->Next
= dpy
->ContextList
;
204 dpy
->ContextList
= ctx
;
205 return (EGLContext
) ctx
;
210 * Unlink a linked context from its display.
211 * Accessing an unlinked context should generate EGL_BAD_CONTEXT error.
214 _eglUnlinkContext(_EGLContext
*ctx
)
218 prev
= ctx
->Display
->ContextList
;
221 if (prev
->Next
== ctx
)
226 prev
->Next
= ctx
->Next
;
229 ctx
->Display
->ContextList
= ctx
->Next
;
238 * Link a surface to a display and return the handle of the link.
239 * The handle can be passed to client directly.
242 _eglLinkSurface(_EGLSurface
*surf
, _EGLDisplay
*dpy
)
245 surf
->Next
= dpy
->SurfaceList
;
246 dpy
->SurfaceList
= surf
;
247 return (EGLSurface
) surf
;
252 * Unlink a linked surface from its display.
253 * Accessing an unlinked surface should generate EGL_BAD_SURFACE error.
256 _eglUnlinkSurface(_EGLSurface
*surf
)
260 prev
= surf
->Display
->SurfaceList
;
263 if (prev
->Next
== surf
)
268 prev
->Next
= surf
->Next
;
272 surf
->Display
->SurfaceList
= surf
->Next
;
276 surf
->Display
= NULL
;
280 #ifndef _EGL_SKIP_HANDLE_CHECK
284 * Return EGL_TRUE if the given handle is a valid handle to a display.
287 _eglCheckDisplayHandle(EGLDisplay dpy
)
291 _eglLockMutex(_eglGlobal
.Mutex
);
292 cur
= _eglGlobal
.DisplayList
;
294 if (cur
== (_EGLDisplay
*) dpy
)
298 _eglUnlockMutex(_eglGlobal
.Mutex
);
299 return (cur
!= NULL
);
304 * Return EGL_TRUE if the given handle is a valid handle to a context.
307 _eglCheckContextHandle(EGLContext ctx
, _EGLDisplay
*dpy
)
311 cur
= dpy
->ContextList
;
313 if (cur
== (_EGLContext
*) ctx
) {
314 assert(cur
->Display
== dpy
);
319 return (cur
!= NULL
);
324 * Return EGL_TRUE if the given handle is a valid handle to a surface.
327 _eglCheckSurfaceHandle(EGLSurface surf
, _EGLDisplay
*dpy
)
331 cur
= dpy
->SurfaceList
;
333 if (cur
== (_EGLSurface
*) surf
) {
334 assert(cur
->Display
== dpy
);
339 return (cur
!= NULL
);
343 #endif /* !_EGL_SKIP_HANDLE_CHECK */