egl: Make resource void pointer in _eglCheckResource.
[mesa.git] / src / egl / main / egldisplay.h
index 372ed3cd79a25f8fba46d0de5406c989bed5722d..5d44eb1ea88f35eca4c8148de45c01c35356a75d 100644 (file)
@@ -1,37 +1,80 @@
 #ifndef EGLDISPLAY_INCLUDED
 #define EGLDISPLAY_INCLUDED
 
-#ifdef _EGL_PLATFORM_X
-#include <X11/Xlib.h>
-#endif
-
 #include "egltypedefs.h"
+#include "egldefines.h"
+
+
+enum _egl_resource_type {
+   _EGL_RESOURCE_CONTEXT,
+   _EGL_RESOURCE_SURFACE,
+   _EGL_RESOURCE_IMAGE,
+
+   _EGL_NUM_RESOURCES
+};
+
+
+/**
+ * A resource of a display.
+ */
+struct _egl_resource
+{
+   _EGLDisplay *Display;
+   _EGLResource *Next;
+};
+
+
+/**
+ * Optional EGL extensions info.
+ */
+struct _egl_extensions
+{
+   EGLBoolean MESA_screen_surface;
+   EGLBoolean MESA_copy_context;
+   EGLBoolean KHR_image_base;
+   EGLBoolean KHR_image_pixmap;
+
+   char String[_EGL_MAX_EXTENSIONS_LEN];
+};
 
 
 struct _egl_display 
 {
+   /* used to link displays */
+   _EGLDisplay *Next;
+
    EGLNativeDisplayType NativeDisplay;
-   EGLDisplay Handle;
 
-   const char *DriverName;
-   const char *DriverArgs;
    _EGLDriver *Driver;
+   void *DriverData; /* private to driver */
+
+   int APImajor, APIminor; /**< as returned by eglInitialize() */
+   char Version[1000];     /**< initialized from APImajor/minor, DriverName */
+
+   /** Bitmask of supported APIs (EGL_xx_BIT) set by the driver during init */
+   EGLint ClientAPIsMask;
+   char ClientAPIs[1000];   /**< updated by eglQueryString */
+
+   _EGLExtensions Extensions;
+
+   int LargestPbuffer;
 
    EGLint NumScreens;
    _EGLScreen **Screens;  /* array [NumScreens] */
 
+   EGLint MaxConfigs;
    EGLint NumConfigs;
    _EGLConfig **Configs;  /* array [NumConfigs] of ptr to _EGLConfig */
 
-   /* lists of linked contexts and surface */
-   _EGLContext *ContextList;
-   _EGLSurface *SurfaceList;
-#ifdef _EGL_PLATFORM_X
-   Display *Xdpy;
-#endif
+   /* lists of resources */
+   _EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
 };
 
 
+extern void
+_eglFiniDisplay(void);
+
+
 extern _EGLDisplay *
 _eglNewDisplay(NativeDisplayType displayName);
 
@@ -44,84 +87,99 @@ extern void
 _eglUnlinkDisplay(_EGLDisplay *dpy);
 
 
-extern EGLDisplay
-_eglGetDisplayHandle(_EGLDisplay *display);
+extern _EGLDisplay *
+_eglFindDisplay(NativeDisplayType nativeDisplay);
 
 
-extern _EGLDisplay *
-_eglLookupDisplay(EGLDisplay dpy);
+PUBLIC void
+_eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *dpy);
 
 
-/**
- * Return true if the display is linked.
- */
-static INLINE EGLBoolean
-_eglIsDisplayLinked(_EGLDisplay *dpy)
-{
-   return (EGLBoolean) (_eglGetDisplayHandle(dpy) != EGL_NO_DISPLAY);
-}
+PUBLIC void
+_eglCleanupDisplay(_EGLDisplay *disp);
 
 
-extern _EGLDisplay *
-_eglFindDisplay(NativeDisplayType nativeDisplay);
+#ifndef _EGL_SKIP_HANDLE_CHECK
 
 
-extern void
-_eglReleaseDisplayResources(_EGLDriver *drv, EGLDisplay dpy);
+extern EGLBoolean
+_eglCheckDisplayHandle(EGLDisplay dpy);
 
 
-extern void
-_eglCleanupDisplay(_EGLDisplay *disp);
+extern EGLBoolean
+_eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy);
 
 
-extern EGLContext
-_eglLinkContext(_EGLContext *ctx, _EGLDisplay *dpy);
+#else /* !_EGL_SKIP_HANDLE_CHECK */
 
+/* Only do a quick check.  This is NOT standard compliant. */
 
-extern void
-_eglUnlinkContext(_EGLContext *ctx);
+static INLINE EGLBoolean
+_eglCheckDisplayHandle(EGLDisplay dpy)
+{
+   return ((_EGLDisplay *) dpy != NULL);
+}
 
 
-extern EGLContext
-_eglGetContextHandle(_EGLContext *ctx);
+static INLINE EGLBoolean
+_eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy);
+{
+   return (((_EGLResource *) res)->Display == dpy);
+}
 
 
-extern _EGLContext *
-_eglLookupContext(EGLContext ctx);
+#endif /* _EGL_SKIP_HANDLE_CHECK */
 
 
 /**
- * Return true if the context is linked to a display.
+ * Lookup a handle to find the linked display.
+ * Return NULL if the handle has no corresponding linked display.
  */
-static INLINE EGLBoolean
-_eglIsContextLinked(_EGLContext *ctx)
+static INLINE _EGLDisplay *
+_eglLookupDisplay(EGLDisplay display)
 {
-   return (EGLBoolean) (_eglGetContextHandle(ctx) != EGL_NO_CONTEXT);
+   _EGLDisplay *dpy = (_EGLDisplay *) display;
+   if (!_eglCheckDisplayHandle(display))
+      dpy = NULL;
+   return dpy;
 }
 
-extern EGLSurface
-_eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy);
 
+/**
+ * Return the handle of a linked display, or EGL_NO_DISPLAY.
+ */
+static INLINE EGLDisplay
+_eglGetDisplayHandle(_EGLDisplay *dpy)
+{
+   return (EGLDisplay) ((dpy) ? dpy : EGL_NO_DISPLAY);
+}
 
-extern void
-_eglUnlinkSurface(_EGLSurface *surf);
+
+/**
+ * Return true if the display is linked.
+ */
+static INLINE EGLBoolean
+_eglIsDisplayLinked(_EGLDisplay *dpy)
+{
+   return (EGLBoolean) (_eglGetDisplayHandle(dpy) != EGL_NO_DISPLAY);
+}
 
 
-extern EGLSurface
-_eglGetSurfaceHandle(_EGLSurface *);
+extern void
+_eglLinkResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy);
 
 
-extern _EGLSurface *
-_eglLookupSurface(EGLSurface surf);
+extern void
+_eglUnlinkResource(_EGLResource *res, _EGLResourceType type);
 
 
 /**
- * Return true if the surface is linked to a display.
+ * Return true if the resource is linked.
  */
 static INLINE EGLBoolean
-_eglIsSurfaceLinked(_EGLSurface *surf)
+_eglIsResourceLinked(_EGLResource *res)
 {
-   return (EGLBoolean) (_eglGetSurfaceHandle(surf) != EGL_NO_SURFACE);
+   return (res->Display != NULL);
 }