X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fmain%2Fegldevice.c;h=cdb8f361acb640b26301dc613002a7d2f156228b;hb=HEAD;hp=4878039be0ebfee4e2f1b71de38cdac12d870b5e;hpb=dbb4457d9858fa977246aa5e9cabe83455022dfe;p=mesa.git diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c index 4878039be0e..cdb8f361acb 100644 --- a/src/egl/main/egldevice.c +++ b/src/egl/main/egldevice.c @@ -108,9 +108,9 @@ static int _eglAddDRMDevice(drmDevicePtr device, _EGLDevice **out_dev) { _EGLDevice *dev; + const int wanted_nodes = 1 << DRM_NODE_RENDER | 1 << DRM_NODE_PRIMARY; - if ((device->available_nodes & (1 << DRM_NODE_PRIMARY | - 1 << DRM_NODE_RENDER)) == 0) + if ((device->available_nodes & wanted_nodes) != wanted_nodes) return -1; dev = _eglGlobal.DeviceList; @@ -211,7 +211,11 @@ _eglDeviceSupports(_EGLDevice *dev, _EGLDeviceExtension ext) const char * _eglGetDRMDeviceRenderNode(_EGLDevice *dev) { +#ifdef HAVE_LIBDRM return dev->device->nodes[DRM_NODE_RENDER]; +#else + return NULL; +#endif } EGLBoolean @@ -235,8 +239,8 @@ _eglQueryDeviceStringEXT(_EGLDevice *dev, EGLint name) case EGL_DRM_DEVICE_FILE_EXT: if (_eglDeviceSupports(dev, _EGL_DEVICE_DRM)) return dev->device->nodes[DRM_NODE_PRIMARY]; - /* fall through */ #endif + /* fall through */ default: _eglError(EGL_BAD_PARAMETER, "eglQueryDeviceStringEXT"); return NULL; @@ -253,7 +257,7 @@ _eglQueryDeviceStringEXT(_EGLDevice *dev, EGLint name) static int _eglRefreshDeviceList(void) { - MAYBE_UNUSED _EGLDevice *dev; + ASSERTED _EGLDevice *dev; int count = 0; dev = _eglGlobal.DeviceList; @@ -305,13 +309,25 @@ _eglQueryDevicesEXT(EGLint max_devices, goto out; } + /* Push the first device (the software one) to the end of the list. + * Sending it to the user only if they've requested the full list. + * + * By default, the user is likely to pick the first device so having the + * software (aka least performant) one is not a good idea. + */ *num_devices = MIN2(num_devs, max_devices); - for (i = 0, dev = devs; i < *num_devices; i++) { + for (i = 0, dev = devs->Next; dev && i < max_devices; i++) { devices[i] = dev; dev = dev->Next; } + /* User requested the full device list, add the sofware device. */ + if (max_devices >= num_devs) { + assert(_eglDeviceSupports(devs, _EGL_DEVICE_SOFTWARE)); + devices[num_devs - 1] = devs; + } + out: mtx_unlock(_eglGlobal.Mutex);