[vlc-devel] [PATCH 1/2] egl_pbuffer: improve support detection
Rémi Denis-Courmont
remi at remlab.net
Tue Mar 2 17:31:59 UTC 2021
Le tiistaina 2. maaliskuuta 2021, 15.51.38 EET Romain Vimont a écrit :
> The video filter egl_pbuffer may be used only if the display is
> refcounted, because we don't know if other modules are using EGL.
>
> This is always the case on Android, so egl_pbuffer was initially only
> enabled on Android:
> https://android.googlesource.com/platform/frameworks/native/+/master/opengl/
> libs/EGL/egl_display.cpp
>
> But this may also be the case on other platforms which support
> EGL_KHR_display_reference:
> https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_display_referenc
> e.txt
>
> Co-authored-by: Alexandre Janniaux <ajanni at videolabs.io>
> ---
> modules/video_filter/egl_pbuffer.c | 53 ++++++++++++++++++++++++-
> modules/video_output/opengl/Makefile.am | 7 ++++
> 2 files changed, 58 insertions(+), 2 deletions(-)
>
> diff --git a/modules/video_filter/egl_pbuffer.c
> b/modules/video_filter/egl_pbuffer.c index 0ecc2562d0..78cd48b3fd 100644
> --- a/modules/video_filter/egl_pbuffer.c
> +++ b/modules/video_filter/egl_pbuffer.c
> @@ -127,12 +127,61 @@ static bool DestroyImageKHR(vlc_gl_t *gl, void *image)
> return sys->eglDestroyImageKHR(sys->display, image);
> }
>
> -static int InitEGL(vlc_gl_t *gl, unsigned width, unsigned height)
> +static bool GetPlatform(const char *extensions, EGLenum *out)
> +{
> +#ifdef EGL_KHR_platform_x11
> + if (vlc_gl_StrHasToken(extensions, "EGL_EXT_platform_x11"))
> + {
> + *out = EGL_PLATFORM_X11_KHR;
> + return true;
> + }
> +#endif
> +
> +#ifdef EGL_KHR_platform_wayland
> + if (vlc_gl_StrHasToken(extensions, "EGL_EXT_platform_wayland"))
> + {
> + *out = EGL_PLATFORM_WAYLAND_KHR;
> + return true;
> + }
> +#endif
> +
> + return false;
> +}
> +
> +static bool InitDefaultEGLDisplay(vlc_gl_t *gl)
> {
> struct vlc_gl_pbuffer *sys = gl->sys;
>
> +#ifdef __ANDROID__
> + /* The default display is refcounted on Android */
> sys->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
> - if (sys->display == EGL_NO_DISPLAY)
> +#elif defined(EGL_KHR_display_reference)
> + const char *extensions = eglQueryString(EGL_NO_DISPLAY,
> EGL_EXTENSIONS); +
> + if (!vlc_gl_StrHasToken(extensions, "EGL_KHR_display_reference"))
> + return false;
> +
> + EGLenum platform;
> + if (!GetPlatform(extensions, &platform))
> + return false;
> +
> + const EGLAttrib attribs[] = {
> + EGL_TRACK_REFERENCES_KHR, EGL_TRUE,
> + EGL_NONE,
> + };
> +
> + sys->display =
> + eglGetPlatformDisplay(platform, EGL_DEFAULT_DISPLAY, attribs);
> +#endif
> +
> + return sys->display != EGL_NO_DISPLAY;
> +}
> +
> +static int InitEGL(vlc_gl_t *gl, unsigned width, unsigned height)
> +{
> + struct vlc_gl_pbuffer *sys = gl->sys;
> +
> + if (!InitDefaultEGLDisplay(gl))
> return VLC_EGENERIC;
>
> /* Initialize EGL display */
> diff --git a/modules/video_output/opengl/Makefile.am
> b/modules/video_output/opengl/Makefile.am index dcb8ace5c6..d3170d9ac7
> 100644
> --- a/modules/video_output/opengl/Makefile.am
> +++ b/modules/video_output/opengl/Makefile.am
> @@ -93,6 +93,13 @@ libegl_pbuffer_filter_plugin_la_SOURCES =
> video_filter/egl_pbuffer.c libegl_pbuffer_filter_plugin_la_CPPFLAGS =
> $(AM_CPPFLAGS) $(EGL_FLAGS) libegl_pbuffer_filter_plugin_la_LIBADD =
> $(LIBM) $(EGL_LIBS)
>
> +if HAVE_LINUX
> +if HAVE_GL
> +libegl_pbuffer_filter_plugin_la_LIBADD += libvlc_opengl.la $(GL_LIBS)
> +vout_LTLIBRARIES += libegl_pbuffer_filter_plugin.la
> +endif
> +endif
> +
That does not look right.
> if HAVE_ANDROID
> libegl_pbuffer_filter_plugin_la_LIBADD += libvlc_opengles.la $(GLES2_LIBS)
> libegl_pbuffer_filter_plugin_la_CPPFLAGS += -DUSE_OPENGL_ES2=1
-1
--
雷米‧德尼-库尔蒙
http://www.remlab.net/
More information about the vlc-devel
mailing list