mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
egl: Remove redundant DeletePending flag.
A context or surface that is neither linked to a display nor current to a thread should be destroyed. Therefore, an unlinked context or surface implies a pending delete automatically. Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
parent
3f7e0d5302
commit
15fdbc8361
13 changed files with 47 additions and 69 deletions
|
|
@ -236,12 +236,8 @@ demoDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
{
|
||||
DemoSurface *fs = LookupDemoSurface(surface);
|
||||
_eglUnlinkSurface(&fs->Base);
|
||||
if (fs->Base.IsBound) {
|
||||
fs->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!fs->Base.IsBound)
|
||||
free(fs);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -251,12 +247,8 @@ demoDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
|
|||
{
|
||||
DemoContext *fc = LookupDemoContext(context);
|
||||
_eglUnlinkContext(&fc->Base);
|
||||
if (fc->Base.IsBound) {
|
||||
fc->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!fc->Base.IsBound)
|
||||
free(fc);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -296,12 +296,8 @@ _eglDRIDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
|
||||
fs->drawable.destroyDrawable(disp, fs->drawable.private);
|
||||
|
||||
if (fs->Base.IsBound) {
|
||||
fs->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!fs->Base.IsBound)
|
||||
free(fs);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -316,12 +312,8 @@ _eglDRIDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
|
|||
|
||||
fc->driContext.destroyContext(disp, 0, fc->driContext.private);
|
||||
|
||||
if (fc->Base.IsBound) {
|
||||
fc->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!fc->Base.IsBound)
|
||||
free(fc);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -739,12 +739,8 @@ GLX_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
return EGL_TRUE;
|
||||
if (surf) {
|
||||
_eglUnlinkSurface(surf);
|
||||
if (surf->IsBound) {
|
||||
surf->DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!surf->IsBound)
|
||||
free(surf);
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -958,10 +958,7 @@ xdri_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
struct xdri_egl_surface *xdri_surf = lookup_surface(surface);
|
||||
if (xdri_surf) {
|
||||
_eglUnlinkSurface(&xdri_surf->Base);
|
||||
if (xdri_surf->Base.IsBound) {
|
||||
xdri_surf->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!xdri_surf->Base.IsBound) {
|
||||
/*
|
||||
st_unreference_framebuffer(surf->Framebuffer);
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -96,12 +96,8 @@ _eglDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx)
|
|||
_EGLContext *context = _eglLookupContext(ctx);
|
||||
if (context) {
|
||||
_eglUnlinkContext(context);
|
||||
if (context->IsBound) {
|
||||
context->DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!context->IsBound)
|
||||
free(context);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
|
|
@ -146,7 +142,7 @@ _eglQueryContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx,
|
|||
|
||||
/**
|
||||
* Drivers will typically call this to do the error checking and
|
||||
* update the various IsBound and DeletePending flags.
|
||||
* update the various flags.
|
||||
* Then, the driver will do its device-dependent Make-Current stuff.
|
||||
*/
|
||||
EGLBoolean
|
||||
|
|
@ -212,7 +208,7 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
|
|||
*/
|
||||
if (oldDrawSurface != NULL) {
|
||||
oldDrawSurface->IsBound = EGL_FALSE;
|
||||
if (oldDrawSurface->DeletePending) {
|
||||
if (!_eglIsSurfaceLinked(oldDrawSurface)) {
|
||||
/* make sure we don't try to rebind a deleted surface */
|
||||
if (draw == oldDrawSurface || draw == oldReadSurface) {
|
||||
draw = NULL;
|
||||
|
|
@ -223,7 +219,7 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
|
|||
}
|
||||
if (oldReadSurface != NULL && oldReadSurface != oldDrawSurface) {
|
||||
oldReadSurface->IsBound = EGL_FALSE;
|
||||
if (oldReadSurface->DeletePending) {
|
||||
if (!_eglIsSurfaceLinked(oldReadSurface)) {
|
||||
/* make sure we don't try to rebind a deleted surface */
|
||||
if (read == oldDrawSurface || read == oldReadSurface) {
|
||||
read = NULL;
|
||||
|
|
@ -234,7 +230,7 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
|
|||
}
|
||||
if (oldContext != NULL) {
|
||||
oldContext->IsBound = EGL_FALSE;
|
||||
if (oldContext->DeletePending) {
|
||||
if (!_eglIsContextLinked(oldContext)) {
|
||||
/* make sure we don't try to rebind a deleted context */
|
||||
if (ctx == oldContext) {
|
||||
ctx = NULL;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ struct _egl_context
|
|||
_EGLSurface *ReadSurface;
|
||||
|
||||
EGLBoolean IsBound;
|
||||
EGLBoolean DeletePending;
|
||||
|
||||
EGLint ClientAPI; /**< EGL_OPENGL_ES_API, EGL_OPENGL_API, EGL_OPENVG_API */
|
||||
EGLint ClientVersion; /**< 1 = OpenGLES 1.x, 2 = OpenGLES 2.x */
|
||||
|
|
|
|||
|
|
@ -52,6 +52,16 @@ extern _EGLDisplay *
|
|||
_eglLookupDisplay(EGLDisplay dpy);
|
||||
|
||||
|
||||
/**
|
||||
* Return true if the display is linked.
|
||||
*/
|
||||
static INLINE EGLBoolean
|
||||
_eglIsDisplayLinked(_EGLDisplay *dpy)
|
||||
{
|
||||
return (EGLBoolean) (_eglGetDisplayHandle(dpy) != EGL_NO_DISPLAY);
|
||||
}
|
||||
|
||||
|
||||
extern _EGLDisplay *
|
||||
_eglFindDisplay(NativeDisplayType nativeDisplay);
|
||||
|
||||
|
|
@ -80,6 +90,15 @@ extern _EGLContext *
|
|||
_eglLookupContext(EGLContext ctx);
|
||||
|
||||
|
||||
/**
|
||||
* Return true if the context is linked to a display.
|
||||
*/
|
||||
static INLINE EGLBoolean
|
||||
_eglIsContextLinked(_EGLContext *ctx)
|
||||
{
|
||||
return (EGLBoolean) (_eglGetContextHandle(ctx) != EGL_NO_CONTEXT);
|
||||
}
|
||||
|
||||
extern EGLSurface
|
||||
_eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy);
|
||||
|
||||
|
|
@ -96,4 +115,14 @@ extern _EGLSurface *
|
|||
_eglLookupSurface(EGLSurface surf);
|
||||
|
||||
|
||||
/**
|
||||
* Return true if the surface is linked to a display.
|
||||
*/
|
||||
static INLINE EGLBoolean
|
||||
_eglIsSurfaceLinked(_EGLSurface *surf)
|
||||
{
|
||||
return (EGLBoolean) (_eglGetSurfaceHandle(surf) != EGL_NO_SURFACE);
|
||||
}
|
||||
|
||||
|
||||
#endif /* EGLDISPLAY_INCLUDED */
|
||||
|
|
|
|||
|
|
@ -413,12 +413,8 @@ _eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
_EGLSurface *surf = _eglLookupSurface(surface);
|
||||
if (surf) {
|
||||
_eglUnlinkSurface(surf);
|
||||
if (surf->IsBound) {
|
||||
surf->DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!surf->IsBound)
|
||||
free(surf);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ struct _egl_surface
|
|||
|
||||
/* May need reference counting here */
|
||||
EGLBoolean IsBound;
|
||||
EGLBoolean DeletePending;
|
||||
EGLBoolean BoundToTexture;
|
||||
|
||||
EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */
|
||||
|
|
|
|||
|
|
@ -148,9 +148,7 @@ drm_destroy_context(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
|
|||
{
|
||||
struct drm_context *c = lookup_drm_context(context);
|
||||
_eglUnlinkContext(&c->base);
|
||||
if (c->base.IsBound) {
|
||||
c->base.DeletePending = EGL_TRUE;
|
||||
} else {
|
||||
if (!c->base.IsBound) {
|
||||
st_destroy_context(c->st);
|
||||
c->pipe->destroy(c->pipe);
|
||||
free(c);
|
||||
|
|
|
|||
|
|
@ -366,9 +366,7 @@ drm_destroy_surface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
struct drm_surface *surf = lookup_drm_surface(surface);
|
||||
_eglUnlinkSurface(&surf->base);
|
||||
|
||||
if (surf->base.IsBound) {
|
||||
surf->base.DeletePending = EGL_TRUE;
|
||||
} else {
|
||||
if (!surf->base.IsBound) {
|
||||
if (surf->screen)
|
||||
drm_takedown_shown_screen(drv, surf->screen);
|
||||
st_unreference_framebuffer(surf->stfb);
|
||||
|
|
|
|||
|
|
@ -382,10 +382,7 @@ xlib_eglDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx)
|
|||
struct xlib_egl_context *context = lookup_context(ctx);
|
||||
if (context) {
|
||||
_eglUnlinkContext(&context->Base);
|
||||
if (context->Base.IsBound) {
|
||||
context->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!context->Base.IsBound) {
|
||||
/* API-dependent clean-up */
|
||||
switch (context->Base.ClientAPI) {
|
||||
case EGL_OPENGL_ES_API:
|
||||
|
|
@ -536,10 +533,7 @@ xlib_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
struct xlib_egl_surface *surf = lookup_surface(surface);
|
||||
if (surf) {
|
||||
_eglUnlinkSurface(&surf->Base);
|
||||
if (surf->Base.IsBound) {
|
||||
surf->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!surf->Base.IsBound) {
|
||||
XFreeGC(surf->Dpy, surf->Gc);
|
||||
st_unreference_framebuffer(surf->Framebuffer);
|
||||
free(surf);
|
||||
|
|
|
|||
|
|
@ -605,12 +605,8 @@ fbDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
|||
{
|
||||
fbSurface *fs = Lookup_fbSurface(surface);
|
||||
_eglUnlinkSurface(&fs->Base);
|
||||
if (fs->Base.IsBound) {
|
||||
fs->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!fs->Base.IsBound)
|
||||
free(fs);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -620,12 +616,8 @@ fbDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
|
|||
{
|
||||
fbContext *fc = Lookup_fbContext(context);
|
||||
_eglUnlinkContext(&fc->Base);
|
||||
if (fc->Base.IsBound) {
|
||||
fc->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
if (!fc->Base.IsBound)
|
||||
free(fc);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue