From: Chia-I Wu Date: Sun, 24 Jan 2010 12:30:04 +0000 (+0800) Subject: egl: Add _EGLResource and _EGLResourceType. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7abf42626fe8552cf898652134f3767e591614ab;p=mesa.git 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. --- diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c index 79efa8477e6..ef144f7f07a 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 77458cb38d6..c1069d7c59a 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 4461440b9b7..a49ffbb0cd3 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;