浏览代码

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>
tags/18.3-branchpoint
Emil Velikov 7 年前
父节点
当前提交
f73c5d27c1
共有 3 个文件被更改,包括 31 次插入1 次删除
  1. 27
    0
      src/egl/main/egldevice.c
  2. 3
    1
      src/egl/main/egldevice.h
  3. 1
    0
      src/egl/main/eglglobals.c

+ 27
- 0
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;
}


+ 3
- 1
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;

+ 1
- 0
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 */

正在加载...
取消
保存