egl: Return the same EGL Display for the same native display.

The latest revision of the spec explicitly requires the same handle to
be returned for the same native display.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
Chia-I Wu 2009-07-16 21:21:56 -07:00 committed by Brian Paul
parent cca31340b5
commit be9d1ab171
3 changed files with 34 additions and 3 deletions

View File

@ -51,9 +51,12 @@ eglGetDisplay(NativeDisplayType nativeDisplay)
{
_EGLDisplay *dpy;
_eglInitGlobals();
dpy = _eglNewDisplay(nativeDisplay);
if (dpy)
_eglLinkDisplay(dpy);
dpy = _eglFindDisplay(nativeDisplay);
if (!dpy) {
dpy = _eglNewDisplay(nativeDisplay);
if (dpy)
_eglLinkDisplay(dpy);
}
return _eglGetDisplayHandle(dpy);
}

View File

@ -96,6 +96,30 @@ _eglLookupDisplay(EGLDisplay dpy)
}
/**
* Find the display corresponding to the specified native display id in all
* linked displays.
*/
_EGLDisplay *
_eglFindDisplay(NativeDisplayType nativeDisplay)
{
EGLuint key = _eglHashFirstEntry(_eglGlobal.Displays);
/* Walk the hash table. Should switch to list if it is a problem. */
while (key) {
_EGLDisplay *dpy = (_EGLDisplay *)
_eglHashLookup(_eglGlobal.Displays, key);
assert(dpy);
if (dpy->NativeDisplay == nativeDisplay)
return dpy;
key = _eglHashNextEntry(_eglGlobal.Displays, key);
}
return NULL;
}
/**
* Free all the data hanging of an _EGLDisplay object, but not
* the object itself.

View File

@ -52,6 +52,10 @@ extern _EGLDisplay *
_eglLookupDisplay(EGLDisplay dpy);
extern _EGLDisplay *
_eglFindDisplay(NativeDisplayType nativeDisplay);
extern void
_eglCleanupDisplay(_EGLDisplay *disp);