Make unbind_egl_display into Drop implementation for EGLDisplay

This commit is contained in:
Drakulix 2018-01-07 13:02:26 +01:00
parent 6b650eb988
commit c5f475ebb5
9 changed files with 23 additions and 59 deletions

View File

@ -7,21 +7,22 @@ description = "Smithay is a library for writing wayland compositors."
repository = "https://github.com/Smithay/smithay" repository = "https://github.com/Smithay/smithay"
[dependencies] [dependencies]
wayland-server = "0.12.4" wayland-server = "0.12.5"
wayland-sys = "0.12.5"
nix = "0.9.0" nix = "0.9.0"
xkbcommon = "0.2.1" xkbcommon = "0.2.1"
tempfile = "2.1.5" tempfile = "2.1.5"
slog = { version = "2.1.1" } slog = { version = "2.1.1" }
slog-stdlog = "3.0.2" slog-stdlog = "3.0.2"
libloading = "0.4.0" libloading = "0.4.0"
wayland-client = { version = "0.12.4", optional = true } wayland-client = { version = "0.12.5", optional = true }
winit = { version = "0.9.0", optional = true } winit = { version = "0.10.0", optional = true }
drm = { version = "^0.3.1", optional = true } drm = { version = "^0.3.1", optional = true }
gbm = { version = "^0.4.0", git = "https://github.com/Smithay/gbm.rs.git", branch = "feature/ref_counted_api", optional = true, default-features = false, features = ["drm-support"] } gbm = { version = "^0.4.0", git = "https://github.com/Smithay/gbm.rs.git", branch = "feature/ref_counted_api", optional = true, default-features = false, features = ["drm-support"] }
glium = { version = "0.19.0", optional = true, default-features = false } glium = { version = "0.19.0", optional = true, default-features = false }
input = { version = "0.4.0", optional = true } input = { version = "0.4.0", optional = true }
udev = { version = "0.2.0", optional = true } udev = { version = "0.2.0", optional = true }
wayland-protocols = { version = "0.12.4", features = ["unstable_protocols", "server"] } wayland-protocols = { version = "0.12.5", features = ["unstable_protocols", "server"] }
image = "0.17.0" image = "0.17.0"
error-chain = "0.11.0" error-chain = "0.11.0"
lazy_static = "1.0.0" lazy_static = "1.0.0"

View File

@ -192,7 +192,4 @@ impl<G: EGLWaylandExtensions + EGLGraphicsBackend + 'static> EGLWaylandExtension
fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> { fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> {
self.display.bind_wl_display(display) self.display.bind_wl_display(display)
} }
fn unbind_wl_display(&self, display: &Display) -> EGLResult<()> {
self.display.unbind_wl_display(display)
}
} }

View File

@ -467,8 +467,4 @@ impl<A: Device + 'static> EGLWaylandExtensions for DrmBackend<A> {
fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> { fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> {
self.backend.context.bind_wl_display(display) self.backend.context.bind_wl_display(display)
} }
fn unbind_wl_display(&self, display: &Display) -> EGLResult<()> {
self.backend.context.unbind_wl_display(display)
}
} }

View File

@ -441,10 +441,6 @@ impl<A: ControlDevice + 'static> EGLWaylandExtensions for DrmDevice<A> {
fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> { fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> {
self.context.bind_wl_display(display) self.context.bind_wl_display(display)
} }
fn unbind_wl_display(&self, display: &Display) -> EGLResult<()> {
self.context.unbind_wl_display(display)
}
} }
impl<A: ControlDevice + 'static> Drop for DrmDevice<A> { impl<A: ControlDevice + 'static> Drop for DrmDevice<A> {

View File

@ -67,7 +67,7 @@ impl Backend for Wayland {
} }
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
pub struct XlibWindow(*const c_void); pub struct XlibWindow(u64);
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
pub enum X11 {} pub enum X11 {}
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
@ -241,7 +241,7 @@ pub unsafe trait NativeSurface {
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]
unsafe impl NativeSurface for XlibWindow { unsafe impl NativeSurface for XlibWindow {
fn ptr(&self) -> ffi::NativeWindowType { self.0 } fn ptr(&self) -> ffi::NativeWindowType { self.0 as *const _ }
} }
#[cfg(feature = "backend_winit")] #[cfg(feature = "backend_winit")]

View File

@ -6,6 +6,7 @@ use std::rc::{Rc, Weak};
use std::fmt; use std::fmt;
use wayland_server::{Display, Resource, StateToken, StateProxy}; use wayland_server::{Display, Resource, StateToken, StateProxy};
use wayland_server::protocol::wl_buffer::WlBuffer; use wayland_server::protocol::wl_buffer::WlBuffer;
use wayland_sys::server::wl_display;
/// Error that can occur when accessing an EGL buffer /// Error that can occur when accessing an EGL buffer
pub enum BufferAccessError { pub enum BufferAccessError {
@ -191,27 +192,13 @@ pub trait EGLWaylandExtensions {
/// This might return `OtherEGLDisplayAlreadyBound` if called for the same /// This might return `OtherEGLDisplayAlreadyBound` if called for the same
/// `Display` multiple times, as only one context may be bound at any given time. /// `Display` multiple times, as only one context may be bound at any given time.
fn bind_wl_display(&self, display: &Display) -> Result<EGLDisplay>; fn bind_wl_display(&self, display: &Display) -> Result<EGLDisplay>;
/// Unbinds this EGL context from the given Wayland display.
///
/// This will stop clients from using previously available extensions
/// to utilize hardware-accelerated surface via EGL.
///
/// ## Errors
///
/// This might return `WlExtensionNotSupported` if binding is not supported
/// by the EGL implementation.
///
/// This might return `OtherEGLDisplayAlreadyBound` if called for the same
/// `Display` multiple times, as only one context may be bound at any given time.
fn unbind_wl_display(&self, display: &Display) -> Result<()>;
} }
pub struct EGLDisplay(Weak<ffi::egl::types::EGLDisplay>); pub struct EGLDisplay(Weak<ffi::egl::types::EGLDisplay>, *mut wl_display);
impl EGLDisplay { impl EGLDisplay {
pub fn new<B: native::Backend, N: native::NativeDisplay<B>>(context: &EGLContext<B, N>) -> EGLDisplay { fn new<B: native::Backend, N: native::NativeDisplay<B>>(context: &EGLContext<B, N>, display: *mut wl_display) -> EGLDisplay {
EGLDisplay(Rc::downgrade(&context.display)) EGLDisplay(Rc::downgrade(&context.display), display)
} }
pub fn egl_buffer_contents(&self, buffer: WlBuffer) -> ::std::result::Result<EGLImages, BufferAccessError> { pub fn egl_buffer_contents(&self, buffer: WlBuffer) -> ::std::result::Result<EGLImages, BufferAccessError> {
@ -284,14 +271,21 @@ impl EGLDisplay {
} }
} }
impl Drop for EGLDisplay {
fn drop(&mut self) {
if let Some(display) = self.0.upgrade() {
if !self.1.is_null() {
unsafe { ffi::egl::UnbindWaylandDisplayWL(*display, self.1 as *mut _); }
}
}
}
}
impl<E: EGLWaylandExtensions> EGLWaylandExtensions for Rc<E> impl<E: EGLWaylandExtensions> EGLWaylandExtensions for Rc<E>
{ {
fn bind_wl_display(&self, display: &Display) -> Result<EGLDisplay> { fn bind_wl_display(&self, display: &Display) -> Result<EGLDisplay> {
(**self).bind_wl_display(display) (**self).bind_wl_display(display)
} }
fn unbind_wl_display(&self, display: &Display) -> Result<()> {
(**self).unbind_wl_display(display)
}
} }
impl<B: native::Backend, N: native::NativeDisplay<B>> EGLWaylandExtensions for EGLContext<B, N> { impl<B: native::Backend, N: native::NativeDisplay<B>> EGLWaylandExtensions for EGLContext<B, N> {
@ -306,17 +300,6 @@ impl<B: native::Backend, N: native::NativeDisplay<B>> EGLWaylandExtensions for E
if res == 0 { if res == 0 {
bail!(ErrorKind::OtherEGLDisplayAlreadyBound); bail!(ErrorKind::OtherEGLDisplayAlreadyBound);
} }
Ok(EGLDisplay::new(self)) Ok(EGLDisplay::new(self, unsafe { display.ptr() }))
}
fn unbind_wl_display(&self, display: &Display) -> Result<()> {
if !self.wl_drm_support {
bail!(ErrorKind::EglExtensionNotSupported(&["EGL_WL_bind_wayland_display"]));
}
let res = unsafe { ffi::egl::UnbindWaylandDisplayWL(*self.display, display.ptr() as *mut _) };
if res == 0 {
bail!(ErrorKind::NoEGLDisplayBound);
}
Ok(())
} }
} }

View File

@ -81,9 +81,6 @@ impl<T: EGLGraphicsBackend + EGLWaylandExtensions + 'static> EGLWaylandExtension
fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> { fn bind_wl_display(&self, display: &Display) -> EGLResult<EGLDisplay> {
(*self.backend).0.bind_wl_display(display) (*self.backend).0.bind_wl_display(display)
} }
fn unbind_wl_display(&self, display: &Display) -> EGLResult<()> {
(*self.backend).0.unbind_wl_display(display)
}
} }

View File

@ -266,13 +266,6 @@ impl EGLWaylandExtensions for WinitGraphicsBackend {
Window::X11 { ref context, .. } => context.bind_wl_display(display), Window::X11 { ref context, .. } => context.bind_wl_display(display),
} }
} }
fn unbind_wl_display(&self, display: &Display) -> EGLResult<()> {
match *self.window {
Window::Wayland { ref context, .. } => context.unbind_wl_display(display),
Window::X11 { ref context, .. } => context.unbind_wl_display(display),
}
}
} }
/// Errors that may happen when driving the event loop of `WinitInputBackend` /// Errors that may happen when driving the event loop of `WinitInputBackend`

View File

@ -13,6 +13,7 @@ extern crate nix;
extern crate tempfile; extern crate tempfile;
extern crate wayland_protocols; extern crate wayland_protocols;
extern crate wayland_server; extern crate wayland_server;
extern crate wayland_sys;
extern crate xkbcommon; extern crate xkbcommon;
#[cfg(feature = "backend_drm")] #[cfg(feature = "backend_drm")]