egl: Remove redundant DeletePending flag.
authorChia-I Wu <olvaffe@gmail.com>
Fri, 17 Jul 2009 17:56:00 +0000 (11:56 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 17 Jul 2009 17:56:00 +0000 (11:56 -0600)
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>
13 files changed:
src/egl/drivers/demo/demo.c
src/egl/drivers/dri/egldri.c
src/egl/drivers/glx/egl_glx.c
src/egl/drivers/xdri/egl_xdri.c
src/egl/main/eglcontext.c
src/egl/main/eglcontext.h
src/egl/main/egldisplay.h
src/egl/main/eglsurface.c
src/egl/main/eglsurface.h
src/gallium/state_trackers/egl/egl_context.c
src/gallium/state_trackers/egl/egl_surface.c
src/gallium/winsys/egl_xlib/egl_xlib.c
src/mesa/drivers/dri/fb/fb_egl.c

index fa9efa5d3555fb3027c3d55d43954c05ed5cdee4..f316974d836b458920364fef03ac7d5375243119 100644 (file)
@@ -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;
 }
 
index df45fbfbe2fd17394c043d67e2229fa4dac794b2..3f9617a8f9807904390aed1c41b103db08940e3c 100644 (file)
@@ -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;
 }
 
index 661b313ae2d06a7e85a9bc313c04c2741de4e553..207b1ea77937c2e0c8ee64b6620675031caabc76 100644 (file)
@@ -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;
    }
index 34d69def6a53767a012fffb0e0284e3970beccd8..e040efdd4387b57aeabf80922ff2e7bf9381d90b 100644 (file)
@@ -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);
          */
index 01cb116d00e174858efa44e785fefcddf6473316..9ab4286d3a8e9cbab51bb12bb4d309cb73b9dc6f 100644 (file)
@@ -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;
index 8e206431770a2e68391dfdc4482f9c45a0b78e42..2fb28d38b91b205db13285c0fbac5ce6719f9d87 100644 (file)
@@ -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 */
index 30b466cb4a08ba7658098a87313b7c2e68b329b8..372ed3cd79a25f8fba46d0de5406c989bed5722d 100644 (file)
@@ -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 */
index b12212458565bdff23dc4e559d5ea13c8163766b..9821e636287805a276cfbdcdd30f012bd7836d40 100644 (file)
@@ -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 {
index f6874e62784a01dcaf28fce14e0a918216e30ff0..f9413eb9d75a78687bd11fd1233c0dd5f4deca2f 100644 (file)
@@ -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 */
index 95dfcb9983ceb6dea71e159df3c8077e30b6beb0..f03a29582a90944ee81c5d2b603c8b072fc554d7 100644 (file)
@@ -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);
index 27b35052d1ceeee58b942dd6a47afb165c77c68e..86f2ea97e549e9d28097ab84bfeafced9d1a2f0f 100644 (file)
@@ -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);
index 9914dff964351295bcbc16d55383c06879a70ffe..e1ddcae97ba94cee5f59cd94dc88ab2b147ccbdd 100644 (file)
@@ -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);
index c367741f52cda26548cd7f3ce0c3e49f7cd84cc5..dee67feb5accd67220103a185163a6d78d2127dd 100644 (file)
@@ -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;
 }