Destroy context in dri2/glx driver when apps call eglDestroyContext

This commit is contained in:
Cooper Yuan 2011-08-14 15:14:17 +08:00
parent e09b706c9e
commit f5e757ea60
2 changed files with 38 additions and 2 deletions

View file

@ -725,6 +725,23 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
return NULL;
}
/**
* Called via eglDestroyContext(), drv->API.DestroyContext().
*/
static EGLBoolean
dri2_destroy_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx)
{
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
if (_eglPutContext(ctx)) {
dri2_dpy->core->destroyContext(dri2_ctx->dri_context);
free(dri2_ctx);
}
return EGL_TRUE;
}
/**
* Called via eglMakeCurrent(), drv->API.MakeCurrent().
*/
@ -765,9 +782,8 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
drv->API.DestroySurface(drv, disp, old_dsurf);
if (old_rsurf)
drv->API.DestroySurface(drv, disp, old_rsurf);
/* no destroy? */
if (old_ctx)
_eglPutContext(old_ctx);
drv->API.DestroyContext(drv, disp, old_ctx);
return EGL_TRUE;
} else {
@ -1348,6 +1364,7 @@ _EGL_MAIN(const char *args)
dri2_drv->base.API.Initialize = dri2_initialize;
dri2_drv->base.API.Terminate = dri2_terminate;
dri2_drv->base.API.CreateContext = dri2_create_context;
dri2_drv->base.API.DestroyContext = dri2_destroy_context;
dri2_drv->base.API.MakeCurrent = dri2_make_current;
dri2_drv->base.API.GetProcAddress = dri2_get_proc_address;
dri2_drv->base.API.WaitClient = dri2_wait_client;

View file

@ -713,6 +713,24 @@ GLX_eglCreateContext(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
return &GLX_ctx->Base;
}
/**
* Called via eglDestroyContext(), drv->API.DestroyContext().
*/
static EGLBoolean
GLX_eglDestroyContext(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx)
{
struct GLX_egl_driver *GLX_drv = GLX_egl_driver(drv);
struct GLX_egl_context *GLX_ctx = GLX_egl_context(ctx);
if (_eglPutContext(ctx)) {
assert(GLX_ctx);
GLX_drv->glXDestroyContext(disp, ctx);
free(GLX_ctx);
}
return EGL_TRUE;
}
/**
* Destroy a surface. The display is allowed to be uninitialized.
@ -1142,6 +1160,7 @@ _EGL_MAIN(const char *args)
GLX_drv->Base.API.Initialize = GLX_eglInitialize;
GLX_drv->Base.API.Terminate = GLX_eglTerminate;
GLX_drv->Base.API.CreateContext = GLX_eglCreateContext;
GLX_drv->Base.API.DestroyContext = GLX_eglDestroyContext;
GLX_drv->Base.API.MakeCurrent = GLX_eglMakeCurrent;
GLX_drv->Base.API.CreateWindowSurface = GLX_eglCreateWindowSurface;
GLX_drv->Base.API.CreatePixmapSurface = GLX_eglCreatePixmapSurface;