mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-10 14:40:13 +01:00
Destroy context in dri2/glx driver when apps call eglDestroyContext
This commit is contained in:
parent
e09b706c9e
commit
f5e757ea60
2 changed files with 38 additions and 2 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue