1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
pub extern crate winit;
pub extern crate voodoo;

use winit::Window as WinitWindow;
use voodoo::{Result as VdResult, Instance, SurfaceKhr};


#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "openbsd"))]
pub fn create_surface(instance: Instance, window: &WinitWindow) -> VdResult<SurfaceKhr> {
    use winit::os::unix::WindowExt;
    use voodoo::{wl_display, wl_surface};

    let mut sb = SurfaceKhr::builder();
    unsafe {
        if let (Some(display), Some(xlib_window)) = (window.get_xlib_display(),
                window.get_xlib_window()) {
            sb.xlib(display as _, xlib_window as _);
        } else if let (Some(display), Some(surface)) = (window.get_wayland_display(),
                window.get_wayland_surface()) {
            sb.wayland(display as *mut wl_display, surface as *mut wl_surface);
        }
    }
    sb.build(instance)
}

#[cfg(target_os = "windows")]
pub fn create_surface(instance: Instance, window: &WinitWindow) -> VdResult<SurfaceKhr> {
    use winit::os::windows::WindowExt;
    use std::ptr;

    unsafe {
        SurfaceKhr::builder()
            .win32(ptr::null_mut(), window.get_hwnd() as *mut _)
            .build(instance)
    }
}

#[cfg(target_os = "android")]
pub fn create_surface(instance: Instance, window: &WinitWindow) -> VdResult<SurfaceKhr> {
    use winit::os::android::WindowExt;

    unsafe {
        SurfaceKhr::builder()
            .android(window.get_native_window())
            .build(instance)
    }
}

#[cfg(target_os = "macos")]
pub fn create_surface(instance: Instance, window: &WinitWindow) -> VdResult<SurfaceKhr> {
    use winit::os::macos::WindowExt;

    unimplemented!();
}