[Mesa-dev] [PATCH 1/3] egl/x11_dri3: disable WL_bind_wayland_display for devices without render nodes

Frank Binns frank.binns at imgtec.com
Thu Aug 18 10:24:47 UTC 2016


On 04/08/16 15:02, Frank Binns wrote:
> On 20/06/16 12:05, Axel Davy wrote:
>> Hi,
>>
>> The three patches make sense to me.
>>
>> Reviewed-by: Axel Davy <axel.davy at ens.fr>
>
> Can someone push these patches for me?
>
> Thanks
> Frank
>
Ping

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