[Mesa-dev] [PATCH 3/3] egl: Implement EGL_EXT_device_{base, query, enumeration}

Adam Jackson ajax at redhat.com
Wed May 3 15:57:45 UTC 2017


From: Jonny Lamb <jonny.lamb at collabora.co.uk>

This is a rebase/squash/rewrite of a series Jonny had sent long ago. The
major change is implementing this in terms of the drmDevice API. Both
relevant piglits go from skip to pass on i965.

Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 src/egl/Makefile.sources        |   2 +
 src/egl/drivers/dri2/egl_dri2.c |  64 +++++++++
 src/egl/main/eglapi.c           |  79 ++++++++++++
 src/egl/main/eglapi.h           |   4 +
 src/egl/main/egldevice.c        | 280 ++++++++++++++++++++++++++++++++++++++++
 src/egl/main/egldevice.h        |  74 +++++++++++
 src/egl/main/eglentrypoint.h    |  10 ++
 src/egl/main/eglglobals.c       |  12 +-
 src/egl/main/eglglobals.h       |   2 +
 src/egl/main/egltypedefs.h      |   4 +
 10 files changed, 529 insertions(+), 2 deletions(-)
 create mode 100644 src/egl/main/egldevice.c
 create mode 100644 src/egl/main/egldevice.h

diff --git a/src/egl/Makefile.sources b/src/egl/Makefile.sources
index e6fd3f114c..bd13bfc06a 100644
--- a/src/egl/Makefile.sources
+++ b/src/egl/Makefile.sources
@@ -11,6 +11,8 @@ LIBEGL_C_FILES := \
 	main/eglcurrent.c \
 	main/eglcurrent.h \
 	main/egldefines.h \
+	main/egldevice.c \
+	main/egldevice.h \
 	main/egldisplay.c \
 	main/egldisplay.h \
 	main/egldriver.c \
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 91456b025d..717ab0f860 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -57,6 +57,7 @@
 
 #include "egl_dri2.h"
 #include "loader/loader.h"
+#include "egldevice.h"
 #include "util/u_atomic.h"
 
 /* The kernel header drm_fourcc.h defines the DRM formats below.  We duplicate
@@ -2861,6 +2862,67 @@ dri2_interop_export_object(_EGLDisplay *dpy, _EGLContext *ctx,
    return dri2_dpy->interop->export_object(dri2_ctx->dri_context, in, out);
 }
 
+#ifdef HAVE_LIBDRM
+/* XXX kind of copypasta of drmCompareBusInfo */
+static int
+dri2_bus_info_equal(drmDevicePtr a, drmDevicePtr b)
+{
+    if (a == NULL || b == NULL)
+	return 0;
+
+    if (a->bustype != b->bustype)
+	return 0;
+
+    if (a->bustype == DRM_BUS_PCI)
+	return !memcmp(a->businfo.pci, b->businfo.pci, sizeof(drmPciBusInfo));
+
+    return 0;
+}
+#endif
+
+static EGLBoolean
+dri2_query_device_from_display(_EGLDisplay *disp, _EGLDeviceInfo *info,
+			       EGLAttrib *value)
+{
+    EGLBoolean ret = EGL_FALSE;
+#ifdef HAVE_LIBDRM
+    struct dri2_egl_display *dri2_dpy = disp->DriverData;
+    drmDevicePtr dev;
+    int i;
+
+    if (dri2_dpy->fd == -1) {
+	*value = (EGLAttrib) info; /* a dummy value is fine */
+	return EGL_TRUE;
+    }
+
+    if (drmGetDevice(dri2_dpy->fd, &dev) < 0)
+	return ret;
+
+    /* loop over _EGLDisplayInfo to find a match */
+    for (i = 0; i < info->num_drm_devices; i++) {
+	if (dri2_bus_info_equal(dev, info->drm_devices[i])) {
+	    *value = (EGLAttrib) info->drm_devices[i];
+	    ret = EGL_TRUE;
+	    break;
+	}
+    }
+
+    drmFreeDevice(&dev);
+#endif
+    return ret;
+}
+
+static const char *
+dri2_query_device_name(_EGLDisplay *disp)
+{
+   struct dri2_egl_display *dri2_dpy = disp->DriverData;
+
+   if (dri2_dpy->fd == -1)
+      return dri2_dpy->driver_name;
+
+   return loader_get_device_name_for_fd(dri2_dpy->fd);
+}
+
 static void
 dri2_unload(_EGLDriver *drv)
 {
@@ -2985,6 +3047,8 @@ _eglBuiltInDriverDRI2(const char *args)
    dri2_drv->base.API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info;
    dri2_drv->base.API.GLInteropExportObject = dri2_interop_export_object;
    dri2_drv->base.API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd;
+   dri2_drv->base.API.QueryDeviceFromDisplay = dri2_query_device_from_display;
+   dri2_drv->base.API.QueryDeviceName = dri2_query_device_name;
 
    dri2_drv->base.Name = "DRI2";
    dri2_drv->base.Unload = dri2_unload;
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index fc243a58e8..2f323e9fd4 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -93,6 +93,7 @@
 
 #include "eglglobals.h"
 #include "eglcontext.h"
+#include "egldevice.h"
 #include "egldisplay.h"
 #include "egltypedefs.h"
 #include "eglcurrent.h"
@@ -156,6 +157,12 @@
 #define _EGL_CHECK_SYNC(disp, s, ret, drv) \
    _EGL_CHECK_OBJECT(disp, Sync, s, ret, drv)
 
+#define _EGL_CHECK_DEVICE(dev, ret, devptr)                     \
+   do {                                                         \
+      devptr = _eglLookupDevice(dev);                           \
+      if (!devptr)                                              \
+         RETURN_EGL_ERROR(NULL, EGL_BAD_DEVICE_EXT, ret);       \
+   } while (0)
 
 struct _egl_entrypoint {
    const char *name;
@@ -2368,6 +2375,78 @@ _eglFunctionCompare(const void *key, const void *elem)
    return strcmp(procname, entrypoint->name);
 }
 
+#ifdef HAVE_LIBDRM
+#ifdef EGL_EXT_device_query
+static EGLBoolean EGLAPIENTRY
+eglQueryDeviceAttribEXT(EGLDeviceEXT device,
+                        EGLint attribute,
+                        EGLAttrib *value)
+{
+   _EGLDevice *dev;
+   EGLBoolean ret;
+
+   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
+
+   _EGL_CHECK_DEVICE(device, EGL_FALSE, dev);
+
+   ret = _eglQueryDeviceAttribEXT(dev, attribute, value);
+
+   RETURN_EGL_EVAL(NULL, ret);
+}
+
+static const char * EGLAPIENTRY
+eglQueryDeviceStringEXT(EGLDeviceEXT device,
+                        EGLint name)
+{
+   _EGLDevice *dev;
+   const char *ret;
+
+   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, NULL);
+
+   _EGL_CHECK_DEVICE(device, NULL, dev);
+
+   ret = _eglQueryDeviceStringEXT(dev, name);
+
+   RETURN_EGL_EVAL(NULL, ret);
+}
+
+static EGLBoolean EGLAPIENTRY
+eglQueryDisplayAttribEXT(EGLDisplay dpy,
+                         EGLint attribute,
+                         EGLAttrib *value)
+{
+   _EGLDisplay *disp = _eglLockDisplay(dpy);
+   _EGLDriver *drv;
+   EGLBoolean ret;
+
+   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
+
+   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
+
+   if (!disp->Initialized)
+      RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
+
+   ret = _eglQueryDisplayAttribEXT(drv, disp, attribute, value);
+
+   RETURN_EGL_EVAL(disp, ret);
+}
+#endif
+
+#ifdef EGL_EXT_device_enumeration
+static EGLBoolean EGLAPIENTRY
+eglQueryDevicesEXT(EGLint max_devices,
+                   EGLDeviceEXT *devices,
+                   EGLint *num_devices)
+{
+   EGLBoolean ret;
+
+   ret = _eglQueryDevicesEXT(max_devices, (_EGLDevice **) devices, num_devices);
+
+   RETURN_EGL_EVAL(NULL, ret);
+}
+#endif
+#endif /* HAVE_LIBDRM */
+
 __eglMustCastToProperFunctionPointerType EGLAPIENTRY
 eglGetProcAddress(const char *procname)
 {
diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h
index 710c5d860a..e2f9651441 100644
--- a/src/egl/main/eglapi.h
+++ b/src/egl/main/eglapi.h
@@ -198,6 +198,10 @@ struct _egl_api
    int (*GLInteropExportObject)(_EGLDisplay *dpy, _EGLContext *ctx,
                                 struct mesa_glinterop_export_in *in,
                                 struct mesa_glinterop_export_out *out);
+   EGLBoolean (*QueryDeviceFromDisplay)(_EGLDisplay *disp,
+					_EGLDeviceInfo *info,
+					EGLAttrib *value);
+   const char *(*QueryDeviceName)(_EGLDisplay *disp);
 };
 
 #ifdef __cplusplus
diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c
new file mode 100644
index 0000000000..62c73cb236
--- /dev/null
+++ b/src/egl/main/egldevice.c
@@ -0,0 +1,280 @@
+/**************************************************************************
+ *
+ * Copyright 2015 Collabora
+ * Copyright 2016 Red Hat, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#include <assert.h>
+#include <string.h>
+
+#include "eglcurrent.h"
+#include "egldevice.h"
+#include "egldriver.h"
+#include "eglglobals.h"
+#include "egllog.h"
+#include "egltypedefs.h"
+
+#define MIN(x,y) (((x)<(y))?(x):(y))
+
+static EGLBoolean
+_eglFillDeviceList(_EGLDeviceInfo *info)
+{
+#ifdef HAVE_LIBDRM
+   info->num_drm_devices = drmGetDevices(NULL, 0);
+
+   if (info->num_drm_devices < 0) {
+      info->num_drm_devices = 0;
+      return EGL_FALSE;
+   }
+
+   info->drm_devices = calloc(info->num_drm_devices, sizeof(drmDevicePtr));
+   if (!info->drm_devices) {
+      info->num_drm_devices = 0;
+      return EGL_FALSE;
+   }
+
+   if (drmGetDevices(info->drm_devices, info->num_drm_devices) < 0) {
+      free(info->drm_devices);
+      info->num_drm_devices = 0;
+      return EGL_FALSE;
+   }
+
+   return EGL_TRUE;
+#else
+   return EGL_FALSE;
+#endif
+}
+
+static _EGLDeviceInfo *
+_eglEnsureDeviceInfo(void)
+{
+   _EGLDeviceInfo *info;
+
+   mtx_lock(_eglGlobal.Mutex);
+
+   info = _eglGlobal.DeviceInfo;
+
+   if (!info) {
+      info = calloc(1, sizeof(_EGLDeviceInfo));
+      if (!info)
+         goto out;
+
+      /* update this string like in eglglobals.c to add support for a device
+       * extension */
+      info->extensions = "";
+
+      if (!_eglFillDeviceList(info)) {
+	 free(info);
+         info = NULL;
+      }
+   }
+
+   _eglGlobal.DeviceInfo = info;
+
+out:
+   mtx_unlock(_eglGlobal.Mutex);
+
+   return info;
+}
+
+/**
+ * Lookup an existing device in the device list.
+ * Return NULL if the device pointer doesn't already exist in the device list.
+ */
+_EGLDevice *
+_eglLookupDevice(EGLDeviceEXT device)
+{
+   _EGLDeviceInfo *info;
+   _EGLDevice *dev = NULL;
+
+   info = _eglEnsureDeviceInfo();
+   if (!info)
+      return NULL;
+
+   mtx_lock(_eglGlobal.Mutex);
+
+   /* special case for swrast */
+   if (device == info)
+      dev = device;
+
+#ifdef HAVE_LIBDRM
+   for (int i = 0; !dev && i < info->num_drm_devices; i++)
+       if ((void *)info->drm_devices[i] == (void *)device)
+	   dev = device;
+#endif
+
+   mtx_unlock(_eglGlobal.Mutex);
+
+   return dev;
+}
+
+/**
+ * Finish device management.
+ */
+void
+_eglFiniDeviceInfo(void)
+{
+   _EGLDeviceInfo *info;
+
+   /* atexit function is called with global mutex locked */
+
+   info = _eglGlobal.DeviceInfo;
+
+   if (!info)
+      return;
+
+#ifdef HAVE_LIBDRM
+   drmFreeDevices(info->drm_devices, info->num_drm_devices);
+   free(info->drm_devices);
+#endif
+
+   free(info);
+   _eglGlobal.DeviceInfo = NULL;
+}
+
+/**
+ * Get attribute about specific device
+ */
+EGLBoolean
+_eglQueryDeviceAttribEXT(_EGLDevice *device,
+                         EGLint attribute,
+                         EGLAttrib *value)
+{
+   if (!value)
+      return _eglError(EGL_BAD_PARAMETER, "eglQueryDeviceAttribEXT");
+
+   switch (attribute) {
+   default:
+      return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryDeviceAttribEXT");
+   }
+}
+
+/**
+ * Get string about a specific device.
+ */
+const char *
+_eglQueryDeviceStringEXT(_EGLDevice *device, EGLint name)
+{
+   _EGLDeviceInfo *info;
+
+   info =_eglEnsureDeviceInfo();
+   if (!info) {
+      _eglError(EGL_BAD_ALLOC, "eglQueryDeviceStringEXT");
+      return NULL;
+   }
+
+   switch (name) {
+   case EGL_EXTENSIONS:
+      return info->extensions;
+
+   default:
+      _eglError(EGL_BAD_PARAMETER, "eglQueryDeviceStringEXT");
+      return NULL;
+   };
+}
+
+static EGLBoolean
+_eglQueryDeviceFromDisplay(_EGLDeviceInfo *info,
+                           _EGLDriver *drv,
+                           _EGLDisplay *disp,
+                           EGLAttrib *value)
+{
+   if (drv->API.QueryDeviceFromDisplay)
+       return drv->API.QueryDeviceFromDisplay(disp, info, value);
+
+   return EGL_FALSE;
+}
+
+EGLBoolean
+_eglQueryDisplayAttribEXT(_EGLDriver *drv,
+                          _EGLDisplay *disp,
+                          EGLint attribute,
+                          EGLAttrib *value)
+{
+   _EGLDeviceInfo *info;
+
+   info = _eglEnsureDeviceInfo();
+   if (!info)
+      return _eglError(EGL_BAD_ALLOC, "eglQueryDisplayAttribEXT");
+
+   if (!value)
+      return _eglError(EGL_BAD_PARAMETER, "eglQueryDisplayAttribEXT");
+
+   switch (attribute) {
+   case EGL_DEVICE_EXT:
+      return _eglQueryDeviceFromDisplay(info, drv, disp, value);
+   default:
+      return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryDisplayAttribEXT");
+   }
+}
+
+/**
+ * Enumerate EGL devices.
+ */
+EGLBoolean
+_eglQueryDevicesEXT(EGLint max_devices,
+                    _EGLDevice **devices,
+                    EGLint *num_devices)
+{
+   _EGLDeviceInfo *info;
+   EGLBoolean ret = EGL_TRUE;
+   int i = 0;
+
+   /* max_devices can only be bad if devices is non-NULL. num_devices must
+    * always be present. */
+   if ((devices && max_devices < 1) || !num_devices)
+      return _eglError(EGL_BAD_PARAMETER, "eglQueryDevicesEXT");
+
+   info = _eglEnsureDeviceInfo();
+   if (!info)
+      return _eglError(EGL_BAD_ALLOC, "eglQueryDevicesEXT");
+
+   mtx_lock(_eglGlobal.Mutex);
+
+   /* count devices */
+#ifdef HAVE_LIBDRM
+   i += info->num_drm_devices;
+#endif
+
+   /* bail early if devices is NULL */
+   if (!devices) {
+      *num_devices = i;
+      goto out;
+   }
+
+   /* create and fill devices array */
+   *num_devices = MIN(i, max_devices);
+
+   i = 0;
+#ifdef HAVE_LIBDRM
+   for (; i < *num_devices && i < info->num_drm_devices; i++)
+       devices[i] = (void *)info->drm_devices[i];
+#endif
+
+out:
+   mtx_unlock(_eglGlobal.Mutex);
+
+   return ret;
+}
diff --git a/src/egl/main/egldevice.h b/src/egl/main/egldevice.h
new file mode 100644
index 0000000000..7159ef19c0
--- /dev/null
+++ b/src/egl/main/egldevice.h
@@ -0,0 +1,74 @@
+/**************************************************************************
+ *
+ * Copyright 2015 Collabora
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+
+#ifndef EGLDEVICE_INCLUDED
+#define EGLDEVICE_INCLUDED
+
+#ifdef HAVE_LIBDRM
+#include <xf86drm.h>
+#endif
+#include "egltypedefs.h"
+
+typedef struct _egl_device_info {
+   const char *extensions;
+
+#ifdef HAVE_LIBDRM
+   drmDevicePtr *drm_devices;
+   int num_drm_devices;
+#endif
+} _EGLDeviceInfo;
+
+
+extern void
+_eglFiniDeviceInfo(void);
+
+
+_EGLDevice *
+_eglLookupDevice(EGLDeviceEXT device);
+
+
+EGLBoolean
+_eglQueryDeviceAttribEXT(_EGLDevice *device, EGLint attribute,
+                         EGLAttrib *value);
+
+
+const char *
+_eglQueryDeviceStringEXT(_EGLDevice *device, EGLint name);
+
+
+EGLBoolean
+_eglQueryDevicesEXT(EGLint max_devices, _EGLDevice **devices,
+                    EGLint *num_devices);
+
+
+EGLBoolean
+_eglQueryDisplayAttribEXT(_EGLDriver *drv, _EGLDisplay *disp,
+                          EGLint attribute, EGLAttrib *value);
+
+
+#endif /* EGLDEVICE_INCLUDED */
diff --git a/src/egl/main/eglentrypoint.h b/src/egl/main/eglentrypoint.h
index e6318b9311..4b06357e59 100644
--- a/src/egl/main/eglentrypoint.h
+++ b/src/egl/main/eglentrypoint.h
@@ -56,6 +56,16 @@ EGL_ENTRYPOINT(eglPostSubBufferNV)
 EGL_ENTRYPOINT(eglQueryAPI)
 EGL_ENTRYPOINT(eglQueryContext)
 EGL_ENTRYPOINT(eglQueryDebugKHR)
+#ifdef HAVE_LIBDRM
+#ifdef EGL_EXT_device_query
+EGL_ENTRYPOINT(eglQueryDeviceAttribEXT)
+EGL_ENTRYPOINT(eglQueryDeviceStringEXT)
+#ifdef EGL_EXT_device_enumeration
+EGL_ENTRYPOINT(eglQueryDevicesEXT)
+#endif
+EGL_ENTRYPOINT(eglQueryDisplayAttribEXT)
+#endif
+#endif
 EGL_ENTRYPOINT(eglQueryString)
 EGL_ENTRYPOINT(eglQuerySurface)
 EGL_ENTRYPOINT(eglQueryWaylandBufferWL)
diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
index baf96bb1ec..2c18458f49 100644
--- a/src/egl/main/eglglobals.c
+++ b/src/egl/main/eglglobals.c
@@ -35,6 +35,7 @@
 #include "c11/threads.h"
 
 #include "eglglobals.h"
+#include "egldevice.h"
 #include "egldisplay.h"
 #include "egldriver.h"
 
@@ -45,15 +46,22 @@ struct _egl_global _eglGlobal =
 {
    &_eglGlobalMutex,       /* Mutex */
    NULL,                   /* DisplayList */
-   2,                      /* NumAtExitCalls */
+   NULL,                   /* DeviceInfo */
+   3,                      /* NumAtExitCalls */
    {
       /* default AtExitCalls, called in reverse order */
       _eglUnloadDrivers, /* always called last */
-      _eglFiniDisplay
+      _eglFiniDisplay,
+      _eglFiniDeviceInfo
    },
 
    /* ClientOnlyExtensionString */
    "EGL_EXT_client_extensions"
+#ifdef HAVE_LIBDRM
+   " EGL_EXT_device_base"
+   " EGL_EXT_device_query"
+   " EGL_EXT_device_enumeration"
+#endif
    " EGL_EXT_platform_base"
    " EGL_KHR_client_get_all_proc_addresses"
    " EGL_KHR_debug",
diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h
index c6ef59d482..7659070854 100644
--- a/src/egl/main/eglglobals.h
+++ b/src/egl/main/eglglobals.h
@@ -54,6 +54,8 @@ struct _egl_global
    /* the list of all displays */
    _EGLDisplay *DisplayList;
 
+   void *DeviceInfo;
+
    EGLint NumAtExitCalls;
    void (*AtExitCalls[10])(void);
 
diff --git a/src/egl/main/egltypedefs.h b/src/egl/main/egltypedefs.h
index 7facdb47f8..8ccb6f5fb5 100644
--- a/src/egl/main/egltypedefs.h
+++ b/src/egl/main/egltypedefs.h
@@ -49,6 +49,10 @@ typedef struct _egl_config _EGLConfig;
 
 typedef struct _egl_context _EGLContext;
 
+typedef struct _egl_device _EGLDevice; /* note: opaque */
+
+typedef struct _egl_device_info _EGLDeviceInfo;
+
 typedef struct _egl_display _EGLDisplay;
 
 typedef struct _egl_driver _EGLDriver;
-- 
2.12.2



More information about the mesa-dev mailing list