[vlc-devel] [PATCH 7/7] egl_display: add GBM platform support

Romain Vimont rom1v at videolabs.io
Wed Mar 3 20:18:33 UTC 2021


On Wed, Mar 03, 2021 at 07:48:12PM +0200, Rémi Denis-Courmont wrote:
> Le keskiviikkona 3. maaliskuuta 2021, 19.36.40 EET Romain Vimont a écrit :
> > From: Alexandre Janniaux <ajanni at videolabs.io>
> > 
> > GBM platform allows to provide an EGL context even without display
> > server.
> > 
> > Co-authored-by: Romain Vimont <rom1v at videolabs.io>
> > ---
> >  configure.ac                                  |  18 +++
> >  modules/video_output/opengl/Makefile.am       |   9 ++
> >  modules/video_output/opengl/egl_display_gbm.c | 106 ++++++++++++++++++
> >  3 files changed, 133 insertions(+)
> >  create mode 100644 modules/video_output/opengl/egl_display_gbm.c
> > 
> > diff --git a/configure.ac b/configure.ac
> > index a82c956c70..cd546da9ca 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -4464,6 +4464,24 @@ AS_IF([test "${enable_osx_notifications}" != "no"], [
> > VLC_ADD_PLUGIN([osx_notifications])
> >  ])
> > 
> > +dnl
> > +dnl Check for GBM
> > +dnl
> > +AC_ARG_ENABLE([gbm],
> > +  AS_HELP_STRING([--enable-gbm],
> > +    [Use GBM for egl_pbuffer (default enabled)]))
> > +have_gbm="no"
> > +AS_IF([test "${enable_gbm}" != "no"], [
> > +  PKG_CHECK_MODULES([GBM], [gbm], [have_gbm="yes"], [
> > +    AS_IF([test -n "${enable_gbm}"], [
> > +      AC_MSG_ERROR([${GBM_PKG_ERRORS}.])
> > +    ], [
> > +      AC_MSG_WARN([${GBM_PKG_ERRORS}.])
> > +    ])
> > +  ])
> > +])
> > +AM_CONDITIONAL([HAVE_GBM], [test "${have_gbm}" = "yes"])
> > +
> >  dnl
> >  dnl Libnotify notification plugin
> >  dnl
> > diff --git a/modules/video_output/opengl/Makefile.am
> > b/modules/video_output/opengl/Makefile.am index c7cbdedfb6..d496093d75
> > 100644
> > --- a/modules/video_output/opengl/Makefile.am
> > +++ b/modules/video_output/opengl/Makefile.am
> > @@ -96,6 +96,15 @@ if HAVE_EGL
> >  vout_LTLIBRARIES += libegl_display_generic_plugin.la
> >  endif
> > 
> > +libegl_display_gbm_plugin_la_SOURCES =
> > video_output/opengl/egl_display_gbm.c
> > +libegl_display_gbm_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(EGL_FLAGS)
> > $(GBM_CFLAGS) +libegl_display_gbm_plugin_la_LIBADD = $(EGL_LIBS)
> > $(GBM_LIBS)
> > +if HAVE_EGL
> > +if HAVE_GBM
> > +vout_LTLIBRARIES += libegl_display_gbm_plugin.la
> > +endif
> > +endif
> > +
> >  libegl_pbuffer_filter_plugin_la_SOURCES = video_filter/egl_pbuffer.c \
> >      video_output/opengl/egl_display.c
> >  libegl_pbuffer_filter_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(EGL_FLAGS)
> > diff --git a/modules/video_output/opengl/egl_display_gbm.c
> > b/modules/video_output/opengl/egl_display_gbm.c new file mode 100644
> > index 0000000000..53049fc5dd
> > --- /dev/null
> > +++ b/modules/video_output/opengl/egl_display_gbm.c
> > @@ -0,0 +1,106 @@
> > +/**************************************************************************
> > *** + * egl_display_gbm.c
> > +
> > ***************************************************************************
> > ** + * Copyright (C) 2021 Videolabs
> > + *
> > + * This program is free software; you can redistribute it and/or modify it
> > + * under the terms of the GNU Lesser General Public License as published by
> > + * the Free Software Foundation; either version 2.1 of the License, or + *
> > (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public License
> > + * along with this program; if not, write to the Free Software Foundation,
> > + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. +
> > ***************************************************************************
> > **/ +
> > +#ifdef HAVE_CONFIG_H
> > +# include "config.h"
> > +#endif
> > +
> > +#include <vlc_common.h>
> > +#include <vlc_plugin.h>
> > +#include <vlc_opengl.h>
> > +#include <vlc_fs.h>
> > +#include <fcntl.h>
> > +#include <assert.h>
> > +
> > +#include <EGL/egl.h>
> > +#include <EGL/eglext.h>
> > +#include <gbm.h>
> > +
> > +#include "egl_display.h"
> > +
> > +struct sys
> > +{
> > +    struct gbm_device *device;
> > +    int fd;
> > +};
> > +
> > +static void Close(struct vlc_egl_display *display)
> > +{
> > +    struct sys *sys = display->sys;
> > +
> > +    assert(sys->device);
> > +    assert(sys->fd >= 0);
> > +
> > +    gbm_device_destroy(sys->device);
> > +    vlc_close(sys->fd);
> > +
> > +    free(sys);
> > +}
> > +
> > +static vlc_egl_display_open_fn Open;
> > +static int
> > +Open(struct vlc_egl_display *display)
> > +{
> > +    struct sys *sys = display->sys = malloc(sizeof(*sys));
> > +    if (!sys)
> > +        return VLC_EGENERIC;
> > +
> > +    const char *extensions = eglQueryString(EGL_NO_DISPLAY,
> > EGL_EXTENSIONS); +    if (!extensions)
> > +        return VLC_EGENERIC;
> > +
> > +    if (!vlc_gl_StrHasToken(extensions, "EGL_KHR_platform_gbm"))
> > +        return VLC_EGENERIC;
> > +
> > +    sys->fd = vlc_open("/dev/dri/card0", O_RDWR);
> 
> IMU, you're supposed to open render(N+128), not cardN, for head-less 
> operations. Also N should probably be configurable.

Indeed, "/dev/dri/renderD128" works on my machine.

I suggest to keep "/dev/dri/card0" by default, and add an option to use
a custom path.

Regards


More information about the vlc-devel mailing list