Mesa (master): egl: Add _EGLResource and _EGLResourceType.

Chia-I Wu olv at kemper.freedesktop.org
Sun Jan 24 12:36:24 UTC 2010


Module: Mesa
Branch: master
Commit: 7abf42626fe8552cf898652134f3767e591614ab
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7abf42626fe8552cf898652134f3767e591614ab

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Sun Jan 24 20:30:04 2010 +0800

egl: Add _EGLResource and _EGLResourceType.

Resources are objects managed by a display.  They can be linked to or
unlinked from a display.  It is also possible to check if a resource is
valid.

---

 src/egl/main/egldisplay.c  |   60 ++++++++++++++++++++++++++++++++++++++++++++
 src/egl/main/egldisplay.h  |   49 +++++++++++++++++++++++++++++++++++
 src/egl/main/egltypedefs.h |    4 +++
 3 files changed, 113 insertions(+), 0 deletions(-)

diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
index 79efa84..ef144f7 100644
--- a/src/egl/main/egldisplay.c
+++ b/src/egl/main/egldisplay.c
@@ -205,4 +205,64 @@ _eglCheckDisplayHandle(EGLDisplay dpy)
 }
 
 
+/**
+ * Return EGL_TRUE if the given resource is valid.  That is, the display does
+ * own the resource.
+ */
+EGLBoolean
+_eglCheckResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy)
+{
+   _EGLResource *list = dpy->ResourceLists[type];
+   
+   while (list) {
+      if (res == list) {
+         assert(list->Display == dpy);
+         break;
+      }
+      list = list->Next;
+   }
+
+   return (list != NULL);
+}
+
+
 #endif /* !_EGL_SKIP_HANDLE_CHECK */
+
+
+/**
+ * Link a resource to a display.
+ */
+void
+_eglLinkResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy)
+{
+   res->Display = dpy;
+   res->Next = dpy->ResourceLists[type];
+   dpy->ResourceLists[type] = res;
+}
+
+
+/**
+ * Unlink a linked resource from its display.
+ */
+void
+_eglUnlinkResource(_EGLResource *res, _EGLResourceType type)
+{
+   _EGLResource *prev;
+
+   prev = res->Display->ResourceLists[type];
+   if (prev != res) {
+      while (prev) {
+         if (prev->Next == res)
+            break;
+         prev = prev->Next;
+      }
+      assert(prev);
+      prev->Next = res->Next;
+   }
+   else {
+      res->Display->ResourceLists[type] = res->Next;
+   }
+
+   res->Next = NULL;
+   res->Display = NULL;
+}
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index 77458cb..c1069d7 100644
--- a/src/egl/main/egldisplay.h
+++ b/src/egl/main/egldisplay.h
@@ -5,6 +5,24 @@
 #include "egldefines.h"
 
 
+enum _egl_resource_type {
+   _EGL_RESOURCE_CONTEXT,
+   _EGL_RESOURCE_SURFACE,
+
+   _EGL_NUM_RESOURCES
+};
+
+
+/**
+ * A resource of a display.
+ */
+struct _egl_resource
+{
+   _EGLDisplay *Display;
+   _EGLResource *Next;
+};
+
+
 /**
  * Optional EGL extensions info.
  */
@@ -48,6 +66,8 @@ struct _egl_display
    /* lists of linked contexts and surface */
    _EGLContext *ContextList;
    _EGLSurface *SurfaceList;
+
+   _EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
 };
 
 
@@ -86,6 +106,10 @@ extern EGLBoolean
 _eglCheckDisplayHandle(EGLDisplay dpy);
 
 
+extern EGLBoolean
+_eglCheckResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy);
+
+
 #else /* !_EGL_SKIP_HANDLE_CHECK */
 
 /* Only do a quick check.  This is NOT standard compliant. */
@@ -97,6 +121,13 @@ _eglCheckDisplayHandle(EGLDisplay dpy)
 }
 
 
+static INLINE EGLBoolean
+_eglCheckResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy)
+{
+   return (res->Display == dpy);
+}
+
+
 #endif /* _EGL_SKIP_HANDLE_CHECK */
 
 
@@ -134,6 +165,24 @@ _eglIsDisplayLinked(_EGLDisplay *dpy)
 }
 
 
+extern void
+_eglLinkResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy);
+
+
+extern void
+_eglUnlinkResource(_EGLResource *res, _EGLResourceType type);
+
+
+/**
+ * Return true if the resource is linked.
+ */
+static INLINE EGLBoolean
+_eglIsResourceLinked(_EGLResource *res)
+{
+   return (res->Display != NULL);
+}
+
+
 /**
  * Cast an unsigned int to a pointer.
  */
diff --git a/src/egl/main/egltypedefs.h b/src/egl/main/egltypedefs.h
index 4461440..a49ffbb 100644
--- a/src/egl/main/egltypedefs.h
+++ b/src/egl/main/egltypedefs.h
@@ -8,6 +8,8 @@
 
 #include "eglcompiler.h"
 
+typedef enum _egl_resource_type _EGLResourceType;
+
 typedef struct _egl_api _EGLAPI;
 
 typedef struct _egl_config _EGLConfig;
@@ -22,6 +24,8 @@ typedef struct _egl_extensions _EGLExtensions;
 
 typedef struct _egl_mode _EGLMode;
 
+typedef struct _egl_resource _EGLResource;
+
 typedef struct _egl_screen _EGLScreen;
 
 typedef struct _egl_surface _EGLSurface;




More information about the mesa-commit mailing list