summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Velikov <[email protected]>2018-07-03 13:08:59 +0100
committerEmil Velikov <[email protected]>2018-11-01 00:05:43 +0000
commitf73c5d27c1f0be9fc5280d508bac483ed54d9b29 (patch)
tree4f04bbfc2550219823e8e63ab9d963c38dc73266
parent3f08e500c4574e12af9c71dbf47ae0aca92262e8 (diff)
egl: add EGL_MESA_device_software support
Add a plain software device, which is always available. We can safely assign it as the first/initial device in _eglGlobals, although we ensure that's the case with a handful of _eglDeviceSupports checks throughout the code. v2: - s/_eglFindDevice/_eglAddDevice/ (Eric) - s/_eglLookupAllDevices/_eglRefreshDeviceList/ (Eric) - move ^^ helpers into a earlier patch (Eric, Mathias) - set the SW device on _eglGlobal init. (Eric) - add a number of _eglDeviceSupports checks (Mathias) - split Device/Display attach to a separate patch v3: - flip inverted asserts (Mathias) - s/on-stack/static/ (Mathias) Signed-off-by: Emil Velikov <[email protected]> Reviewed-by: Mathias Fröhlich <[email protected]>
-rw-r--r--src/egl/main/egldevice.c27
-rw-r--r--src/egl/main/egldevice.h4
-rw-r--r--src/egl/main/eglglobals.c1
3 files changed, 31 insertions, 1 deletions
diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c
index 49c000a0151..e285dd33fb7 100644
--- a/src/egl/main/egldevice.c
+++ b/src/egl/main/egldevice.c
@@ -37,6 +37,8 @@ struct _egl_device {
_EGLDevice *Next;
const char *extensions;
+
+ EGLBoolean MESA_device_software;
};
void
@@ -47,6 +49,12 @@ _eglFiniDevice(void)
/* atexit function is called with global mutex locked */
dev_list = _eglGlobal.DeviceList;
+
+ /* The first device is static allocated SW device */
+ assert(dev_list);
+ assert(_eglDeviceSupports(dev_list, _EGL_DEVICE_SOFTWARE));
+ dev_list = dev_list->Next;
+
while (dev_list) {
/* pop list head */
dev = dev_list;
@@ -74,6 +82,11 @@ _eglCheckDeviceHandle(EGLDeviceEXT device)
return (cur != NULL);
}
+_EGLDevice _eglSoftwareDevice = {
+ .extensions = "EGL_MESA_device_software",
+ .MESA_device_software = EGL_TRUE,
+};
+
/* Adds a device in DeviceList, if needed for the given fd.
*
* If a software device, the fd is ignored.
@@ -84,6 +97,13 @@ _eglAddDevice(int fd, bool software)
_EGLDevice *dev;
mtx_lock(_eglGlobal.Mutex);
+ dev = _eglGlobal.DeviceList;
+
+ /* The first device is always software */
+ assert(dev);
+ assert(_eglDeviceSupports(dev, _EGL_DEVICE_SOFTWARE));
+ if (software)
+ goto out;
dev = NULL;
@@ -96,6 +116,8 @@ EGLBoolean
_eglDeviceSupports(_EGLDevice *dev, _EGLDeviceExtension ext)
{
switch (ext) {
+ case _EGL_DEVICE_SOFTWARE:
+ return dev->MESA_device_software;
default:
assert(0);
return EGL_FALSE;
@@ -140,6 +162,11 @@ _eglRefreshDeviceList(void)
dev = _eglGlobal.DeviceList;
+ /* The first device is always software */
+ assert(dev);
+ assert(_eglDeviceSupports(dev, _EGL_DEVICE_SOFTWARE));
+ count++;
+
return count;
}
diff --git a/src/egl/main/egldevice.h b/src/egl/main/egldevice.h
index f8f3fdc1907..74b5ddeee5c 100644
--- a/src/egl/main/egldevice.h
+++ b/src/egl/main/egldevice.h
@@ -38,6 +38,8 @@
extern "C" {
#endif
+extern _EGLDevice _eglSoftwareDevice;
+
void
_eglFiniDevice(void);
@@ -57,7 +59,7 @@ _EGLDevice *
_eglAddDevice(int fd, bool software);
enum _egl_device_extension {
- EGL_FOOBAR, /* A temporary entry, since enum with zero entries is illegal */
+ _EGL_DEVICE_SOFTWARE,
};
typedef enum _egl_device_extension _EGLDeviceExtension;
diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
index ac8bb3f328a..db81fcaf2b5 100644
--- a/src/egl/main/eglglobals.c
+++ b/src/egl/main/eglglobals.c
@@ -52,6 +52,7 @@ struct _egl_global _eglGlobal =
{
.Mutex = &_eglGlobalMutex,
.DisplayList = NULL,
+ .DeviceList = &_eglSoftwareDevice,
.NumAtExitCalls = 3,
.AtExitCalls = {
/* default AtExitCalls, called in reverse order */