egl: Destroy display's resources upon termination.
eglTerminate should destroy the contexts and surfaces of the display. Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
parent
be9d1ab171
commit
3f7e0d5302
|
@ -120,6 +120,38 @@ _eglFindDisplay(NativeDisplayType nativeDisplay)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Destroy the contexts and surfaces that are linked to the display.
|
||||
*/
|
||||
void
|
||||
_eglReleaseDisplayResources(_EGLDriver *drv, EGLDisplay dpy)
|
||||
{
|
||||
_EGLDisplay *display;
|
||||
_EGLContext *contexts;
|
||||
_EGLSurface *surfaces;
|
||||
|
||||
display = _eglLookupDisplay(dpy);
|
||||
if (!display)
|
||||
return;
|
||||
contexts = display->ContextList;
|
||||
surfaces = display->SurfaceList;
|
||||
|
||||
while (contexts) {
|
||||
EGLContext handle = _eglGetContextHandle(contexts);
|
||||
contexts = contexts->Next;
|
||||
drv->API.DestroyContext(drv, dpy, handle);
|
||||
}
|
||||
assert(!display->ContextList);
|
||||
|
||||
while (surfaces) {
|
||||
EGLSurface handle = _eglGetSurfaceHandle(surfaces);
|
||||
surfaces = surfaces->Next;
|
||||
drv->API.DestroySurface(drv, dpy, handle);
|
||||
}
|
||||
assert(!display->SurfaceList);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Free all the data hanging of an _EGLDisplay object, but not
|
||||
* the object itself.
|
||||
|
|
|
@ -56,6 +56,10 @@ extern _EGLDisplay *
|
|||
_eglFindDisplay(NativeDisplayType nativeDisplay);
|
||||
|
||||
|
||||
extern void
|
||||
_eglReleaseDisplayResources(_EGLDriver *drv, EGLDisplay dpy);
|
||||
|
||||
|
||||
extern void
|
||||
_eglCleanupDisplay(_EGLDisplay *disp);
|
||||
|
||||
|
|
|
@ -284,9 +284,7 @@ _eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy)
|
|||
|
||||
_eglLog(_EGL_DEBUG, "Closing %s", drv->Name);
|
||||
|
||||
/*
|
||||
* XXX check for currently bound context/surfaces and delete them?
|
||||
*/
|
||||
_eglReleaseDisplayResources(drv, dpy);
|
||||
|
||||
b = drv->API.Terminate(drv, dpy);
|
||||
|
||||
|
|
Loading…
Reference in New Issue