summaryrefslogtreecommitdiff
path: root/src/egl/main/egldevice.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/egl/main/egldevice.c')
-rw-r--r--src/egl/main/egldevice.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c
index 3662babdbf..79c657ab88 100644
--- a/src/egl/main/egldevice.c
+++ b/src/egl/main/egldevice.c
@@ -31,8 +31,12 @@
#include <libudev.h>
#endif
+#include <assert.h>
+#include <string.h>
+
#include "eglcurrent.h"
#include "egldevice.h"
+#include "egldriver.h"
#include "eglglobals.h"
#include "egllog.h"
#include "egltypedefs.h"
@@ -257,6 +261,76 @@ _eglQueryDeviceStringEXT(_EGLDevice *device, EGLint name)
}
static EGLBoolean
+_eglQueryDeviceFromDisplay(_EGLDeviceInfo *info,
+ _EGLDriver *drv,
+ _EGLDisplay *disp,
+ EGLAttrib *value)
+{
+#ifdef HAVE_LIBUDEV
+ const char *device_name = NULL;
+ _EGLDevice *dev;
+ UDEV_SYMBOL(const char *, udev_device_get_property_value,
+ (struct udev_device *, const char *));
+
+ if (dlsym_failed)
+ return EGL_FALSE;
+
+ if (!drv->QueryDeviceName)
+ return EGL_FALSE;
+
+ device_name = drv->QueryDeviceName(disp);
+
+ mtx_lock(_eglGlobal.Mutex);
+
+ assert(info->got_devices);
+
+ for (dev = info->devices; dev; dev = dev->Next) {
+ const char *devname = udev_device_get_property_value(
+ dev->Info, "DEVNAME");
+
+ if (!devname)
+ continue;
+
+ if (!strcmp(devname, device_name))
+ break;
+ }
+
+ mtx_unlock(_eglGlobal.Mutex);
+
+ *value = (EGLAttrib) dev;
+
+ return (dev) ? EGL_TRUE : EGL_FALSE;
+#else
+ return EGL_FALSE;
+#endif
+}
+
+EGLBoolean
+_eglQueryDisplayAttribEXT(_EGLDriver *drv,
+ _EGLDisplay *disp,
+ EGLint attribute,
+ EGLAttrib *value)
+{
+ _EGLDeviceInfo *info;
+
+ info = _eglEnsureDeviceInfo(EGL_TRUE);
+ 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);
+ break;
+ default:
+ return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryDisplayAttribEXT");
+ break;
+ }
+}
+
+static EGLBoolean
_eglFillDeviceList(_EGLDeviceInfo *info)
{
#ifdef HAVE_LIBUDEV