[Mesa-dev] [PATCH 1/3] egl/x11_dri3: disable WL_bind_wayland_display for devices without render nodes
Axel Davy
axel.davy at ens.fr
Mon Jun 20 11:05:14 UTC 2016
Hi,
The three patches make sense to me.
Reviewed-by: Axel Davy <axel.davy at ens.fr>
On 17/06/2016 19:41, Frank Binns wrote :
> Up until now, DRI3 was only used for devices that have render nodes, unless
> overridden via an environment variable, with it falling back to DRI2 otherwise.
> This limitation was there in order to support WL_bind_wayland_display as it
> requires client opened device node fds to be authenticated, which isn't possible
> when using DRI3. This is an unfortunate compromise as DRI3 provides security
> benefits over DRI2.
>
> Instead, allow DRI3 to be used for devices without render nodes but don't
> advertise WL_bind_wayland_display in this case. Applications that need this
> extension can still be run by disabling DRI3 support via the LIBGL_DRI3_DISABLE
> environment variable.
>
> Signed-off-by: Frank Binns <frank.binns at imgtec.com>
> ---
> src/egl/drivers/dri2/platform_x11.c | 3 ++-
> src/egl/drivers/dri2/platform_x11_dri3.c | 33 +++++---------------------------
> 2 files changed, 7 insertions(+), 29 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
> index c0a4005..1b50889 100644
> --- a/src/egl/drivers/dri2/platform_x11.c
> +++ b/src/egl/drivers/dri2/platform_x11.c
> @@ -1335,7 +1335,8 @@ dri2_initialize_x11_dri3(_EGLDriver *drv, _EGLDisplay *disp)
> disp->Extensions.EXT_buffer_age = EGL_TRUE;
>
> #ifdef HAVE_WAYLAND_PLATFORM
> - disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
> + if (dri2_dpy->device_name)
> + disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
> #endif
>
> if (dri2_dpy->conn) {
> diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c
> index 9363a8a..b781987 100644
> --- a/src/egl/drivers/dri2/platform_x11_dri3.c
> +++ b/src/egl/drivers/dri2/platform_x11_dri3.c
> @@ -437,29 +437,6 @@ struct dri2_egl_display_vtbl dri3_x11_display_vtbl = {
> .get_dri_drawable = dri3_get_dri_drawable,
> };
>
> -static char *
> -dri3_get_device_name(int fd)
> -{
> - char *ret = NULL;
> -
> - ret = drmGetRenderDeviceNameFromFd(fd);
> - if (ret)
> - return ret;
> -
> - /* For dri3, render node support is required for WL_bind_wayland_display.
> - * In order not to regress on older systems without kernel or libdrm
> - * support, fall back to dri2. User can override it with environment
> - * variable if they don't need to use that extension.
> - */
> - if (getenv("EGL_FORCE_DRI3") == NULL) {
> - _eglLog(_EGL_WARNING, "Render node support not available, falling back to dri2");
> - _eglLog(_EGL_WARNING, "If you want to force dri3, set EGL_FORCE_DRI3 environment variable");
> - } else
> - ret = loader_get_device_name_for_fd(fd);
> -
> - return ret;
> -}
> -
> EGLBoolean
> dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
> {
> @@ -539,11 +516,11 @@ dri3_x11_connect(struct dri2_egl_display *dri2_dpy)
> return EGL_FALSE;
> }
>
> - dri2_dpy->device_name = dri3_get_device_name(dri2_dpy->fd);
> - if (!dri2_dpy->device_name) {
> - close(dri2_dpy->fd);
> - return EGL_FALSE;
> - }
> + /* Only try to get a render device name since it's only needed for
> + * WL_bind_wayland_display and dri3 doesn't provide a mechanism for
> + * authenticating client opened device node fds. If this fails then
> + * don't advertise the extension. */
> + dri2_dpy->device_name = drmGetRenderDeviceNameFromFd(dri2_dpy->fd);
>
> return EGL_TRUE;
> }
More information about the mesa-dev
mailing list