diff options
-rw-r--r-- | Cargo.toml | 14 | ||||
-rw-r--r-- | build.rs | 2 | ||||
-rw-r--r-- | src/api/android/mod.rs | 2 | ||||
-rw-r--r-- | src/api/dlopen.rs | 2 | ||||
-rw-r--r-- | src/api/egl/ffi.rs | 2 | ||||
-rw-r--r-- | src/api/egl/mod.rs | 211 | ||||
-rw-r--r-- | src/api/glx/mod.rs | 2 | ||||
-rw-r--r-- | src/api/osmesa/mod.rs | 2 | ||||
-rw-r--r-- | src/api/wayland/mod.rs | 2 | ||||
-rw-r--r-- | src/api/x11/mod.rs | 2 | ||||
-rw-r--r-- | src/api/x11/window.rs | 2 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/platform/linux/mod.rs | 2 | ||||
-rw-r--r-- | src/platform/mod.rs | 6 |
14 files changed, 143 insertions, 110 deletions
@@ -108,3 +108,17 @@ wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] } wayland-kbd = "0.2.0" wayland-window = "0.1.0" x11-dl = "~2.0" + +[target.x86_64-unknown-dragonfly.dependencies] +osmesa-sys = "0.0.5" +wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] } +wayland-kbd = "0.2.0" +wayland-window = "0.1.0" +x11-dl = "~2.0" + +[target.x86_64-unknown-freebsd.dependencies] +osmesa-sys = "0.0.5" +wayland-client = { version = "0.2.1", features = ["egl", "dlopen"] } +wayland-kbd = "0.2.0" +wayland-window = "0.1.0" +x11-dl = "~2.0" @@ -59,7 +59,7 @@ fn main() { "1.5", "core", &mut file).unwrap(); } - if target.contains("linux") { + if target.contains("linux") || target.contains("dragonfly") || target.contains("freebsd") { let mut file = File::create(&dest.join("glx_bindings.rs")).unwrap(); gl_generator::generate_bindings(gl_generator::StructGenerator, gl_generator::registry::Ns::Glx, diff --git a/src/api/android/mod.rs b/src/api/android/mod.rs index 1b52cc0..0f770c2 100644 --- a/src/api/android/mod.rs +++ b/src/api/android/mod.rs @@ -257,7 +257,7 @@ impl HeadlessContext { pub fn new(builder: BuilderAttribs) -> Result<HeadlessContext, CreationError> { let context = try!(EglContext::new(egl::ffi::egl::Egl, &builder, egl::NativeDisplay::Android)); let context = try!(context.finish_pbuffer()); - Ok(context) + Ok(HeadlessContext(context)) } } diff --git a/src/api/dlopen.rs b/src/api/dlopen.rs index 945dfb0..1bb2a0a 100644 --- a/src/api/dlopen.rs +++ b/src/api/dlopen.rs @@ -1,4 +1,4 @@ -#![cfg(target_os = "linux")] +#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))] #![allow(dead_code)] use libc; diff --git a/src/api/egl/ffi.rs b/src/api/egl/ffi.rs index 6a81ada..ae02e30 100644 --- a/src/api/egl/ffi.rs +++ b/src/api/egl/ffi.rs @@ -33,3 +33,5 @@ pub type EGLNativeWindowType = winapi::HWND; pub type EGLNativeWindowType = *const libc::c_void; #[cfg(target_os = "android")] pub type EGLNativeWindowType = *const libc::c_void; +#[cfg(any(target_os = "dragonfly", target_os = "freebsd"))] +pub type EGLNativeWindowType = *const libc::c_void; diff --git a/src/api/egl/mod.rs b/src/api/egl/mod.rs index 015396e..4cd7a7c 100644 --- a/src/api/egl/mod.rs +++ b/src/api/egl/mod.rs @@ -1,4 +1,5 @@ -#![cfg(any(target_os = "windows", target_os = "linux", target_os = "android"))] +#![cfg(any(target_os = "windows", target_os = "linux", target_os = "android", + target_os = "dragonfly", target_os = "freebsd"))] #![allow(unused_variables)] use BuilderAttribs; @@ -41,6 +42,116 @@ pub struct Context { pixel_format: PixelFormat, } +#[cfg(target_os = "android")] +fn get_native_display(egl: &ffi::egl::Egl, + native_display: NativeDisplay) -> *const libc::c_void { + unsafe { egl.GetDisplay(ffi::egl::DEFAULT_DISPLAY as *mut _) } +} + +#[cfg(not(target_os = "android"))] +fn get_native_display(egl: &ffi::egl::Egl, + native_display: NativeDisplay) -> *const libc::c_void { + // the first step is to query the list of extensions without any display, if supported + let dp_extensions = unsafe { + let p = egl.QueryString(ffi::egl::NO_DISPLAY, ffi::egl::EXTENSIONS as i32); + + // this possibility is available only with EGL 1.5 or EGL_EXT_platform_base, otherwise + // `eglQueryString` returns an error + if p.is_null() { + vec![] + } else { + let p = CStr::from_ptr(p); + let list = String::from_utf8(p.to_bytes().to_vec()).unwrap_or_else(|_| format!("")); + list.split(' ').map(|e| e.to_string()).collect::<Vec<_>>() + } + }; + + let has_dp_extension = |e: &str| dp_extensions.iter().find(|s| s == &e).is_some(); + + match native_display { + // Note: Some EGL implementations are missing the `eglGetPlatformDisplay(EXT)` symbol + // despite reporting `EGL_EXT_platform_base`. I'm pretty sure this is a bug. + // Therefore we detect whether the symbol is loaded in addition to checking for + // extensions. + NativeDisplay::X11(display) if has_dp_extension("EGL_KHR_platform_x11") && + egl.GetPlatformDisplay.is_loaded() => + { + let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); + // TODO: `PLATFORM_X11_SCREEN_KHR` + unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_X11_KHR, d as *mut _, + ptr::null()) } + }, + + NativeDisplay::X11(display) if has_dp_extension("EGL_EXT_platform_x11") && + egl.GetPlatformDisplayEXT.is_loaded() => + { + let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); + // TODO: `PLATFORM_X11_SCREEN_EXT` + unsafe { egl.GetPlatformDisplayEXT(ffi::egl::PLATFORM_X11_EXT, d as *mut _, + ptr::null()) } + }, + + NativeDisplay::Gbm(display) if has_dp_extension("EGL_KHR_platform_gbm") && + egl.GetPlatformDisplay.is_loaded() => + { + let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); + unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_GBM_KHR, d as *mut _, + ptr::null()) } + }, + + NativeDisplay::Gbm(display) if has_dp_extension("EGL_MESA_platform_gbm") && + egl.GetPlatformDisplayEXT.is_loaded() => + { + let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); + unsafe { egl.GetPlatformDisplayEXT(ffi::egl::PLATFORM_GBM_KHR, d as *mut _, + ptr::null()) } + }, + + NativeDisplay::Wayland(display) if has_dp_extension("EGL_KHR_platform_wayland") && + egl.GetPlatformDisplay.is_loaded() => + { + let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); + unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_WAYLAND_KHR, d as *mut _, + ptr::null()) } + }, + + NativeDisplay::Wayland(display) if has_dp_extension("EGL_EXT_platform_wayland") && + egl.GetPlatformDisplayEXT.is_loaded() => + { + let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); + unsafe { egl.GetPlatformDisplayEXT(ffi::egl::PLATFORM_WAYLAND_EXT, d as *mut _, + ptr::null()) } + }, + + // TODO: This will never be reached right now, as the android egl bindings + // use the static generator, so can't rely on GetPlatformDisplay(EXT). + NativeDisplay::Android if has_dp_extension("EGL_KHR_platform_android") && + egl.GetPlatformDisplay.is_loaded() => + { + unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_ANDROID_KHR, + ffi::egl::DEFAULT_DISPLAY as *mut _, ptr::null()) } + }, + + NativeDisplay::Device(display) if has_dp_extension("EGL_EXT_platform_device") && + egl.GetPlatformDisplay.is_loaded() => + { + unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_DEVICE_EXT, display as *mut _, + ptr::null()) } + }, + + NativeDisplay::X11(Some(display)) | NativeDisplay::Gbm(Some(display)) | + NativeDisplay::Wayland(Some(display)) | NativeDisplay::Device(display) | + NativeDisplay::Other(Some(display)) => { + unsafe { egl.GetDisplay(display as *mut _) } + } + + NativeDisplay::X11(None) | NativeDisplay::Gbm(None) | NativeDisplay::Wayland(None) | + NativeDisplay::Android | NativeDisplay::Other(None) => { + unsafe { egl.GetDisplay(ffi::egl::DEFAULT_DISPLAY as *mut _) } + }, + } +} + impl Context { /// Start building an EGL context. /// @@ -55,104 +166,8 @@ impl Context { unimplemented!() } - // the first step is to query the list of extensions without any display, if supported - let dp_extensions = unsafe { - let p = egl.QueryString(ffi::egl::NO_DISPLAY, ffi::egl::EXTENSIONS as i32); - - // this possibility is available only with EGL 1.5 or EGL_EXT_platform_base, otherwise - // `eglQueryString` returns an error - if p.is_null() { - vec![] - } else { - let p = CStr::from_ptr(p); - let list = String::from_utf8(p.to_bytes().to_vec()).unwrap_or_else(|_| format!("")); - list.split(' ').map(|e| e.to_string()).collect::<Vec<_>>() - } - }; - - let has_dp_extension = |e: &str| dp_extensions.iter().find(|s| s == &e).is_some(); - // calling `eglGetDisplay` or equivalent - let display = match native_display { - // Note: Some EGL implementations are missing the `eglGetPlatformDisplay(EXT)` symbol - // despite reporting `EGL_EXT_platform_base`. I'm pretty sure this is a bug. - // Therefore we detect whether the symbol is loaded in addition to checking for - // extensions. - NativeDisplay::X11(display) if has_dp_extension("EGL_KHR_platform_x11") && - egl.GetPlatformDisplay.is_loaded() => - { - let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); - // TODO: `PLATFORM_X11_SCREEN_KHR` - unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_X11_KHR, d as *mut _, - ptr::null()) } - }, - - NativeDisplay::X11(display) if has_dp_extension("EGL_EXT_platform_x11") && - egl.GetPlatformDisplayEXT.is_loaded() => - { - let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); - // TODO: `PLATFORM_X11_SCREEN_EXT` - unsafe { egl.GetPlatformDisplayEXT(ffi::egl::PLATFORM_X11_EXT, d as *mut _, - ptr::null()) } - }, - - NativeDisplay::Gbm(display) if has_dp_extension("EGL_KHR_platform_gbm") && - egl.GetPlatformDisplay.is_loaded() => - { - let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); - unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_GBM_KHR, d as *mut _, - ptr::null()) } - }, - - NativeDisplay::Gbm(display) if has_dp_extension("EGL_MESA_platform_gbm") && - egl.GetPlatformDisplayEXT.is_loaded() => - { - let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); - unsafe { egl.GetPlatformDisplayEXT(ffi::egl::PLATFORM_GBM_KHR, d as *mut _, - ptr::null()) } - }, - - NativeDisplay::Wayland(display) if has_dp_extension("EGL_KHR_platform_wayland") && - egl.GetPlatformDisplay.is_loaded() => - { - let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); - unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_WAYLAND_KHR, d as *mut _, - ptr::null()) } - }, - - NativeDisplay::Wayland(display) if has_dp_extension("EGL_EXT_platform_wayland") && - egl.GetPlatformDisplayEXT.is_loaded() => - { - let d = display.unwrap_or(ffi::egl::DEFAULT_DISPLAY as *const _); - unsafe { egl.GetPlatformDisplayEXT(ffi::egl::PLATFORM_WAYLAND_EXT, d as *mut _, - ptr::null()) } - }, - - NativeDisplay::Android if has_dp_extension("EGL_KHR_platform_android") && - egl.GetPlatformDisplay.is_loaded() => - { - unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_ANDROID_KHR, - ffi::egl::DEFAULT_DISPLAY as *mut _, ptr::null()) } - }, - - NativeDisplay::Device(display) if has_dp_extension("EGL_EXT_platform_device") && - egl.GetPlatformDisplay.is_loaded() => - { - unsafe { egl.GetPlatformDisplay(ffi::egl::PLATFORM_DEVICE_EXT, display as *mut _, - ptr::null()) } - }, - - NativeDisplay::X11(Some(display)) | NativeDisplay::Gbm(Some(display)) | - NativeDisplay::Wayland(Some(display)) | NativeDisplay::Device(display) | - NativeDisplay::Other(Some(display)) => { - unsafe { egl.GetDisplay(display as *mut _) } - } - - NativeDisplay::X11(None) | NativeDisplay::Gbm(None) | NativeDisplay::Wayland(None) | - NativeDisplay::Android | NativeDisplay::Other(None) => { - unsafe { egl.GetDisplay(ffi::egl::DEFAULT_DISPLAY as *mut _) } - }, - }; + let display = get_native_display(&egl, native_display); if display.is_null() { return Err(CreationError::OsError("Could not create EGL display object".to_string())); diff --git a/src/api/glx/mod.rs b/src/api/glx/mod.rs index 72bdf03..0b2cf9f 100644 --- a/src/api/glx/mod.rs +++ b/src/api/glx/mod.rs @@ -1,4 +1,4 @@ -#![cfg(all(target_os = "linux", feature = "window"))] +#![cfg(all(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"), feature = "window"))] use BuilderAttribs; use ContextError; diff --git a/src/api/osmesa/mod.rs b/src/api/osmesa/mod.rs index 056e2d1..9bd24b6 100644 --- a/src/api/osmesa/mod.rs +++ b/src/api/osmesa/mod.rs @@ -1,4 +1,4 @@ -#![cfg(any(target_os = "linux", target_os = "freebsd"))] +#![cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly"))] extern crate osmesa_sys; diff --git a/src/api/wayland/mod.rs b/src/api/wayland/mod.rs index 0381f31..b46e2d1 100644 --- a/src/api/wayland/mod.rs +++ b/src/api/wayland/mod.rs @@ -1,4 +1,4 @@ -#![cfg(target_os = "linux")] +#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))] #![allow(unused_variables, dead_code)] use self::wayland::egl::{EGLSurface, is_egl_available}; diff --git a/src/api/x11/mod.rs b/src/api/x11/mod.rs index 1ba6bc7..39b99f3 100644 --- a/src/api/x11/mod.rs +++ b/src/api/x11/mod.rs @@ -1,4 +1,4 @@ -#![cfg(all(target_os = "linux", feature = "window"))] +#![cfg(all(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"), feature = "window"))] pub use self::monitor::{MonitorID, get_available_monitors, get_primary_monitor}; pub use self::window::{Window, XWindow, PollEventsIterator, WaitEventsIterator, Context, WindowProxy}; diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index 36b60e4..5bfbda9 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -186,7 +186,7 @@ impl<'a> Iterator for PollEventsIterator<'a> { } match xev.get_type() { - ffi::KeymapNotify => { + ffi::MappingNotify => { unsafe { (xlib.XRefreshKeyboardMapping)(mem::transmute(&xev)); } }, @@ -55,7 +55,7 @@ extern crate cocoa; extern crate core_foundation; #[cfg(target_os = "macos")] extern crate core_graphics; -#[cfg(any(target_os = "linux", target_os = "freebsd"))] +#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly"))] extern crate x11_dl; pub use events::*; diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index fc42f18..3525ce5 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -1,4 +1,4 @@ -#![cfg(target_os = "linux")] +#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))] use Api; use BuilderAttribs; diff --git a/src/platform/mod.rs b/src/platform/mod.rs index c4b2265..4855765 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -3,7 +3,7 @@ pub use self::platform::*; #[cfg(target_os = "windows")] #[path="windows/mod.rs"] mod platform; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))] #[path="linux/mod.rs"] mod platform; #[cfg(target_os = "macos")] @@ -16,5 +16,7 @@ mod platform; #[path="ios/mod.rs"] mod platform; -#[cfg(all(not(target_os = "ios"), not(target_os = "windows"), not(target_os = "linux"), not(target_os = "macos"), not(target_os = "android")))] +#[cfg(all(not(target_os = "ios"), not(target_os = "windows"), not(target_os = "linux"), + not(target_os = "macos"), not(target_os = "android"), not(target_os = "dragonfly"), + not(target_os = "freebsd")))] use this_platform_is_not_supported; |