diff options
author | Chia-I Wu <olvaffe@gmail.com> | 2009-07-16 21:21:56 -0700 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2009-07-17 11:53:39 -0600 |
commit | be9d1ab171b1b29108c781af84dd500707a12925 (patch) | |
tree | bdaf340d06688f7158f73eb50ead0a5013eaee86 | |
parent | cca31340b5a9c0b941946753a31236c7201ca87c (diff) |
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>
-rw-r--r-- | src/egl/main/eglapi.c | 9 | ||||
-rw-r--r-- | src/egl/main/egldisplay.c | 24 | ||||
-rw-r--r-- | src/egl/main/egldisplay.h | 4 |
3 files changed, 34 insertions, 3 deletions
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index eaee9facd8..f0a6f7f935 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -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); } diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c index a30e810b4a..1f1f41ea71 100644 --- a/src/egl/main/egldisplay.c +++ b/src/egl/main/egldisplay.c @@ -97,6 +97,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. */ diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index ac285f52a7..0a6003f39e 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -52,6 +52,10 @@ extern _EGLDisplay * _eglLookupDisplay(EGLDisplay dpy); +extern _EGLDisplay * +_eglFindDisplay(NativeDisplayType nativeDisplay); + + extern void _eglCleanupDisplay(_EGLDisplay *disp); |