mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
egl: Make eglGetDisplay atomic.
Merge _eglNewDisplay and _eglLinkDisplay into _eglFindDisplay. Remove unused _eglUnlinkDisplay.
This commit is contained in:
parent
99bcb1f06d
commit
db5ce8b384
3 changed files with 22 additions and 103 deletions
|
|
@ -208,18 +208,12 @@ _eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
|
|||
|
||||
/**
|
||||
* This is typically the first EGL function that an application calls.
|
||||
* We initialize our global vars and create a private _EGLDisplay object.
|
||||
* It associates a private _EGLDisplay object to the native display.
|
||||
*/
|
||||
EGLDisplay EGLAPIENTRY
|
||||
eglGetDisplay(EGLNativeDisplayType nativeDisplay)
|
||||
{
|
||||
_EGLDisplay *dpy;
|
||||
dpy = _eglFindDisplay(nativeDisplay);
|
||||
if (!dpy) {
|
||||
dpy = _eglNewDisplay(nativeDisplay);
|
||||
if (dpy)
|
||||
_eglLinkDisplay(dpy);
|
||||
}
|
||||
_EGLDisplay *dpy = _eglFindDisplay(nativeDisplay);
|
||||
return _eglGetDisplayHandle(dpy);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,73 +45,8 @@ _eglFiniDisplay(void)
|
|||
|
||||
|
||||
/**
|
||||
* Allocate a new _EGLDisplay object for the given nativeDisplay handle.
|
||||
* We'll also try to determine the device driver name at this time.
|
||||
*
|
||||
* Note that nativeDisplay may be an X Display ptr, or a string.
|
||||
*/
|
||||
_EGLDisplay *
|
||||
_eglNewDisplay(EGLNativeDisplayType nativeDisplay)
|
||||
{
|
||||
_EGLDisplay *dpy = (_EGLDisplay *) calloc(1, sizeof(_EGLDisplay));
|
||||
if (dpy) {
|
||||
_eglInitMutex(&dpy->Mutex);
|
||||
dpy->NativeDisplay = nativeDisplay;
|
||||
}
|
||||
return dpy;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Link a display to itself and return the handle of the link.
|
||||
* The handle can be passed to client directly.
|
||||
*/
|
||||
EGLDisplay
|
||||
_eglLinkDisplay(_EGLDisplay *dpy)
|
||||
{
|
||||
_eglLockMutex(_eglGlobal.Mutex);
|
||||
|
||||
dpy->Next = _eglGlobal.DisplayList;
|
||||
_eglGlobal.DisplayList = dpy;
|
||||
|
||||
_eglUnlockMutex(_eglGlobal.Mutex);
|
||||
|
||||
return (EGLDisplay) dpy;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unlink a linked display from itself.
|
||||
* Accessing an unlinked display should generate EGL_BAD_DISPLAY error.
|
||||
*/
|
||||
void
|
||||
_eglUnlinkDisplay(_EGLDisplay *dpy)
|
||||
{
|
||||
_EGLDisplay *prev;
|
||||
|
||||
_eglLockMutex(_eglGlobal.Mutex);
|
||||
|
||||
prev = _eglGlobal.DisplayList;
|
||||
if (prev != dpy) {
|
||||
while (prev) {
|
||||
if (prev->Next == dpy)
|
||||
break;
|
||||
prev = prev->Next;
|
||||
}
|
||||
assert(prev);
|
||||
prev->Next = dpy->Next;
|
||||
}
|
||||
else {
|
||||
_eglGlobal.DisplayList = dpy->Next;
|
||||
}
|
||||
|
||||
_eglUnlockMutex(_eglGlobal.Mutex);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Find the display corresponding to the specified native display id in all
|
||||
* linked displays.
|
||||
* Find the display corresponding to the specified native display, or create a
|
||||
* new one.
|
||||
*/
|
||||
_EGLDisplay *
|
||||
_eglFindDisplay(EGLNativeDisplayType nativeDisplay)
|
||||
|
|
@ -120,18 +55,30 @@ _eglFindDisplay(EGLNativeDisplayType nativeDisplay)
|
|||
|
||||
_eglLockMutex(_eglGlobal.Mutex);
|
||||
|
||||
/* search the display list first */
|
||||
dpy = _eglGlobal.DisplayList;
|
||||
while (dpy) {
|
||||
if (dpy->NativeDisplay == nativeDisplay) {
|
||||
_eglUnlockMutex(_eglGlobal.Mutex);
|
||||
return dpy;
|
||||
}
|
||||
if (dpy->NativeDisplay == nativeDisplay)
|
||||
break;
|
||||
dpy = dpy->Next;
|
||||
}
|
||||
|
||||
/* create a new display */
|
||||
if (!dpy) {
|
||||
dpy = (_EGLDisplay *) calloc(1, sizeof(_EGLDisplay));
|
||||
if (dpy) {
|
||||
_eglInitMutex(&dpy->Mutex);
|
||||
dpy->NativeDisplay = nativeDisplay;
|
||||
|
||||
/* add to the display list */
|
||||
dpy->Next = _eglGlobal.DisplayList;
|
||||
_eglGlobal.DisplayList = dpy;
|
||||
}
|
||||
}
|
||||
|
||||
_eglUnlockMutex(_eglGlobal.Mutex);
|
||||
|
||||
return NULL;
|
||||
return dpy;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -88,19 +88,7 @@ _eglFiniDisplay(void);
|
|||
|
||||
|
||||
extern _EGLDisplay *
|
||||
_eglNewDisplay(EGLNativeDisplayType displayName);
|
||||
|
||||
|
||||
extern EGLDisplay
|
||||
_eglLinkDisplay(_EGLDisplay *dpy);
|
||||
|
||||
|
||||
extern void
|
||||
_eglUnlinkDisplay(_EGLDisplay *dpy);
|
||||
|
||||
|
||||
extern _EGLDisplay *
|
||||
_eglFindDisplay(EGLNativeDisplayType nativeDisplay);
|
||||
_eglFindDisplay(EGLNativeDisplayType displayName);
|
||||
|
||||
|
||||
PUBLIC void
|
||||
|
|
@ -167,16 +155,6 @@ _eglGetDisplayHandle(_EGLDisplay *dpy)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return true if the display is linked.
|
||||
*/
|
||||
static INLINE EGLBoolean
|
||||
_eglIsDisplayLinked(_EGLDisplay *dpy)
|
||||
{
|
||||
return (EGLBoolean) (_eglGetDisplayHandle(dpy) != EGL_NO_DISPLAY);
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
_eglLinkResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue