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:

committed by
Emil Velikov

parent
3f08e500c4
commit
f73c5d27c1
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -52,6 +52,7 @@ struct _egl_global _eglGlobal =
|
||||
{
|
||||
.Mutex = &_eglGlobalMutex,
|
||||
.DisplayList = NULL,
|
||||
.DeviceList = &_eglSoftwareDevice,
|
||||
.NumAtExitCalls = 3,
|
||||
.AtExitCalls = {
|
||||
/* default AtExitCalls, called in reverse order */
|
||||
|
Reference in New Issue
Block a user