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 <emil.velikov@collabora.com>
Reviewed-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
This commit is contained in:
Emil Velikov
2018-07-03 13:08:59 +01:00
committed by Emil Velikov
parent 3f08e500c4
commit f73c5d27c1
3 changed files with 31 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -52,6 +52,7 @@ struct _egl_global _eglGlobal =
{
.Mutex = &_eglGlobalMutex,
.DisplayList = NULL,
.DeviceList = &_eglSoftwareDevice,
.NumAtExitCalls = 3,
.AtExitCalls = {
/* default AtExitCalls, called in reverse order */