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.
This commit is contained in:
@@ -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 */
|
#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;
|
||||||
|
}
|
||||||
|
@@ -5,6 +5,24 @@
|
|||||||
#include "egldefines.h"
|
#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.
|
* Optional EGL extensions info.
|
||||||
*/
|
*/
|
||||||
@@ -48,6 +66,8 @@ struct _egl_display
|
|||||||
/* lists of linked contexts and surface */
|
/* lists of linked contexts and surface */
|
||||||
_EGLContext *ContextList;
|
_EGLContext *ContextList;
|
||||||
_EGLSurface *SurfaceList;
|
_EGLSurface *SurfaceList;
|
||||||
|
|
||||||
|
_EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -86,6 +106,10 @@ extern EGLBoolean
|
|||||||
_eglCheckDisplayHandle(EGLDisplay dpy);
|
_eglCheckDisplayHandle(EGLDisplay dpy);
|
||||||
|
|
||||||
|
|
||||||
|
extern EGLBoolean
|
||||||
|
_eglCheckResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy);
|
||||||
|
|
||||||
|
|
||||||
#else /* !_EGL_SKIP_HANDLE_CHECK */
|
#else /* !_EGL_SKIP_HANDLE_CHECK */
|
||||||
|
|
||||||
/* Only do a quick check. This is NOT standard compliant. */
|
/* 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 */
|
#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.
|
* Cast an unsigned int to a pointer.
|
||||||
*/
|
*/
|
||||||
|
@@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include "eglcompiler.h"
|
#include "eglcompiler.h"
|
||||||
|
|
||||||
|
typedef enum _egl_resource_type _EGLResourceType;
|
||||||
|
|
||||||
typedef struct _egl_api _EGLAPI;
|
typedef struct _egl_api _EGLAPI;
|
||||||
|
|
||||||
typedef struct _egl_config _EGLConfig;
|
typedef struct _egl_config _EGLConfig;
|
||||||
@@ -22,6 +24,8 @@ typedef struct _egl_extensions _EGLExtensions;
|
|||||||
|
|
||||||
typedef struct _egl_mode _EGLMode;
|
typedef struct _egl_mode _EGLMode;
|
||||||
|
|
||||||
|
typedef struct _egl_resource _EGLResource;
|
||||||
|
|
||||||
typedef struct _egl_screen _EGLScreen;
|
typedef struct _egl_screen _EGLScreen;
|
||||||
|
|
||||||
typedef struct _egl_surface _EGLSurface;
|
typedef struct _egl_surface _EGLSurface;
|
||||||
|
Reference in New Issue
Block a user