examples/glupload: Remove Wayland display integration

`GstGLDisplayWayland` calls GstGLDisplayEGL::from_gl_display()` under
the hood (which calls `GstGLDisplayEGL::from_native()`, which calls
`eglGetPlatformDisplay()`) to retrieve the underlying `EGLDisplay`
handle, which thus far seems to be the same value as `glutin`.  However,
newer `glutin 0.31` passes attributes to this function resulting in a
different handle, causing all kinds of trouble further down the line
when sharing resources between `glutin` and `gstreamer-rs` that both
operate on a distinct `EGLDisplay`.

Furthermore `GstGLDisplayEGL` thinks that it uniquely owns the
handle returned by `eglGetPlatformDisplay()` and _does not_ set
`.foreign_display = TRUE` (which `GstGLDisplayEGL::with_egl_display()`
would), causing it to call `eglTerminate()` as soon as the
`GstGLDisplay` is destroyed, leaving `glutin` dysfunctional.

To solve all of this, simply remove this wrongly-behaving class from the
example as it is not suitable for sharing an `EGLDisplay` with `glutin`.

It might however be interesting to create a different example that
showcases how to use raw window handles instead of EGL/GLX handles,
however only Wayland and any platform on EGL like Android, via
`GstGLDisplayEGL::from_native()`, support this.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1336>
This commit is contained in:
Marijn Suijten 2023-11-02 22:18:17 +01:00
parent 0f3d2d6d09
commit 5fdd56747f
4 changed files with 12 additions and 42 deletions

View file

@ -23,7 +23,7 @@ done
if [ -n "$EXAMPLES_TUTORIALS" ]; then if [ -n "$EXAMPLES_TUTORIALS" ]; then
# Keep in sync with examples/Cargo.toml # Keep in sync with examples/Cargo.toml
# List all features except windows/win32 # List all features except windows/win32
EXAMPLES_FEATURES="--features=rtsp-server,rtsp-server-record,pango-cairo,overlay-composition,gl,gst-gl-x11,gst-gl-wayland,gst-gl-egl,allocators,gst-play,gst-player,ges,image,cairo-rs,gst-video/v1_18" EXAMPLES_FEATURES="--features=rtsp-server,rtsp-server-record,pango-cairo,overlay-composition,gl,gst-gl-x11,gst-gl-egl,allocators,gst-play,gst-player,ges,image,cairo-rs,gst-video/v1_18"
cargo build --locked --color=always --manifest-path examples/Cargo.toml --bins --examples "$EXAMPLES_FEATURES" cargo build --locked --color=always --manifest-path examples/Cargo.toml --bins --examples "$EXAMPLES_FEATURES"
cargo build --locked --color=always --manifest-path tutorials/Cargo.toml --bins --examples --all-features cargo build --locked --color=always --manifest-path tutorials/Cargo.toml --bins --examples --all-features

View file

@ -34,7 +34,7 @@ done
# Keep in sync with examples/Cargo.toml # Keep in sync with examples/Cargo.toml
# List all features except windows/win32 # List all features except windows/win32
EXAMPLES_FEATURES="--features=rtsp-server,rtsp-server-record,pango-cairo,overlay-composition,gl,gst-gl-x11,gst-gl-wayland,gst-gl-egl,allocators,gst-play,gst-player,ges,image,cairo-rs,gst-video/v1_18" EXAMPLES_FEATURES="--features=rtsp-server,rtsp-server-record,pango-cairo,overlay-composition,gl,gst-gl-x11,gst-gl-egl,allocators,gst-play,gst-player,ges,image,cairo-rs,gst-video/v1_18"
# And also run over all the examples/tutorials # And also run over all the examples/tutorials
cargo clippy --locked --color=always --manifest-path examples/Cargo.toml --all-targets "$EXAMPLES_FEATURES" -- $CLIPPY_LINTS cargo clippy --locked --color=always --manifest-path examples/Cargo.toml --all-targets "$EXAMPLES_FEATURES" -- $CLIPPY_LINTS

View file

@ -11,7 +11,6 @@ glib = { git = "https://github.com/gtk-rs/gtk-rs-core" }
gst = { package = "gstreamer", path = "../gstreamer" } gst = { package = "gstreamer", path = "../gstreamer" }
gst-gl = { package = "gstreamer-gl", path = "../gstreamer-gl", optional = true } gst-gl = { package = "gstreamer-gl", path = "../gstreamer-gl", optional = true }
gst-gl-egl = { package = "gstreamer-gl-egl", path = "../gstreamer-gl/egl", optional = true } gst-gl-egl = { package = "gstreamer-gl-egl", path = "../gstreamer-gl/egl", optional = true }
gst-gl-wayland = { package = "gstreamer-gl-wayland", path = "../gstreamer-gl/wayland", optional = true }
gst-gl-x11 = { package = "gstreamer-gl-x11", path = "../gstreamer-gl/x11", optional = true } gst-gl-x11 = { package = "gstreamer-gl-x11", path = "../gstreamer-gl/x11", optional = true }
gst-app = { package = "gstreamer-app", path = "../gstreamer-app" } gst-app = { package = "gstreamer-app", path = "../gstreamer-app" }
gst-audio = { package = "gstreamer-audio", path = "../gstreamer-audio" } gst-audio = { package = "gstreamer-audio", path = "../gstreamer-audio" }
@ -61,7 +60,6 @@ overlay-composition = ["pango", "pangocairo", "cairo-rs"]
gl = ["gst-gl", "gl_generator", "glutin"] gl = ["gst-gl", "gl_generator", "glutin"]
gst-gl-x11 = ["dep:gst-gl-x11"] gst-gl-x11 = ["dep:gst-gl-x11"]
gst-gl-egl = ["dep:gst-gl-egl"] gst-gl-egl = ["dep:gst-gl-egl"]
gst-gl-wayland = ["dep:gst-gl-wayland"]
allocators = ["gst-allocators", "memmap2", "memfd", "uds"] allocators = ["gst-allocators", "memmap2", "memfd", "uds"]
[[bin]] [[bin]]

View file

@ -332,12 +332,12 @@ impl App {
let windowed_context = unsafe { windowed_context.make_current().map_err(|(_, err)| err)? }; let windowed_context = unsafe { windowed_context.make_current().map_err(|(_, err)| err)? };
#[cfg(any(feature = "gst-gl-x11", feature = "gst-gl-wayland"))] #[cfg(any(feature = "gst-gl-x11"))]
let inner_window = windowed_context.window(); let inner_window = windowed_context.window();
let shared_context: gst_gl::GLContext; let shared_context: gst_gl::GLContext;
if cfg!(target_os = "linux") { if cfg!(target_os = "linux") {
#[cfg(any(feature = "gst-gl-x11", feature = "gst-gl-wayland"))] #[cfg(any(feature = "gst-gl-x11"))]
use glutin::platform::unix::WindowExtUnix; use glutin::platform::unix::WindowExtUnix;
use glutin::platform::{unix::RawHandle, ContextTraitExt}; use glutin::platform::{unix::RawHandle, ContextTraitExt};
@ -345,47 +345,19 @@ impl App {
let (gl_context, gl_display, platform) = match unsafe { windowed_context.raw_handle() } let (gl_context, gl_display, platform) = match unsafe { windowed_context.raw_handle() }
{ {
#[cfg(any(feature = "gst-gl-egl", feature = "gst-gl-wayland"))] #[cfg(any(feature = "gst-gl-egl"))]
RawHandle::Egl(egl_context) => { RawHandle::Egl(egl_context) => {
let mut gl_display = None; let gl_display =
#[cfg(feature = "gst-gl-egl")]
if let Some(display) = unsafe { windowed_context.get_egl_display() } { if let Some(display) = unsafe { windowed_context.get_egl_display() } {
gl_display = Some(
unsafe { gst_gl_egl::GLDisplayEGL::with_egl_display(display as usize) } unsafe { gst_gl_egl::GLDisplayEGL::with_egl_display(display as usize) }
.unwrap() .unwrap()
.upcast::<gst_gl::GLDisplay>(), } else {
) panic!("EGL window without EGL Display")
};
#[cfg(feature = "gst-gl-wayland")]
if let Some(display) = inner_window.wayland_display() {
let gl_display = gl_display.insert(
unsafe {
gst_gl_wayland::GLDisplayWayland::with_display(display as usize)
}
.unwrap()
.upcast::<gst_gl::GLDisplay>(),
);
// If using a Wayland display, resolving that to an EGL display _should_
// result in the same handle that glutin found (both via eglGetPlatformDisplay(EXT)()).
#[cfg(feature = "gst-gl-egl")]
{
let gl_display =
gst_gl_egl::GLDisplayEGL::from_gl_display(gl_display).unwrap();
assert_eq!(
unsafe { windowed_context.get_egl_display() }
.expect("Wayland clients use EGL"),
gl_display.handle() as *const std::ffi::c_void,
"GLDisplayWayland must use the same EGLDisplay as glutin!"
);
}
}; };
( (
egl_context as usize, egl_context as usize,
gl_display.expect("Could not retrieve GLDisplay through EGL context and/or Wayland display"), gl_display.upcast::<gst_gl::GLDisplay>(),
gst_gl::GLPlatform::EGL, gst_gl::GLPlatform::EGL,
) )
} }
@ -394,7 +366,7 @@ impl App {
let gl_display = if let Some(display) = inner_window.xlib_display() { let gl_display = if let Some(display) = inner_window.xlib_display() {
unsafe { gst_gl_x11::GLDisplayX11::with_display(display as usize) }.unwrap() unsafe { gst_gl_x11::GLDisplayX11::with_display(display as usize) }.unwrap()
} else { } else {
panic!("X11 window without X Display"); panic!("X11 window without X Display")
}; };
( (