diff --git a/surfman/src/connection.rs b/surfman/src/connection.rs index 04e3685..f402314 100644 --- a/surfman/src/connection.rs +++ b/surfman/src/connection.rs @@ -5,6 +5,10 @@ use crate::Error; use crate::GLApi; +use euclid::default::Size2D; + +use std::os::raw::c_void; + #[cfg(feature = "sm-winit")] use winit::Window; @@ -61,4 +65,7 @@ pub trait Connection: Sized { #[cfg(feature = "sm-winit")] fn create_native_widget_from_winit_window(&self, window: &Window) -> Result; + + /// Creates a native widget from a raw pointer + unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, size: Size2D) -> Self::NativeWidget; } diff --git a/surfman/src/implementation/connection.rs b/surfman/src/implementation/connection.rs index 16f4215..9837f90 100644 --- a/surfman/src/implementation/connection.rs +++ b/surfman/src/implementation/connection.rs @@ -10,6 +10,10 @@ use super::super::connection::{Connection, NativeConnection}; use super::super::device::{Adapter, Device, NativeDevice}; use super::super::surface::NativeWidget; +use euclid::default::Size2D; + +use std::os::raw::c_void; + #[cfg(feature = "sm-winit")] use winit::Window; @@ -79,4 +83,9 @@ impl ConnectionInterface for Connection { -> Result { Connection::create_native_widget_from_winit_window(self, window) } + + #[inline] + unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, size: Size2D) -> NativeWidget { + Connection::create_native_widget_from_ptr(self, raw, size) + } } diff --git a/surfman/src/platform/android/connection.rs b/surfman/src/platform/android/connection.rs index c5d3fbe..130a28b 100644 --- a/surfman/src/platform/android/connection.rs +++ b/surfman/src/platform/android/connection.rs @@ -7,8 +7,13 @@ use crate::Error; use crate::GLApi; use super::device::{Adapter, Device, NativeDevice}; +use super::ffi::ANativeWindow; use super::surface::NativeWidget; +use euclid::default::Size2D; + +use std::os::raw::c_void; + #[cfg(feature = "sm-winit")] use winit::Window; @@ -106,6 +111,13 @@ impl Connection { -> Result { Err(Error::UnsupportedOnThisPlatform) } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, _size: Size2D) -> NativeWidget { + NativeWidget { + native_window: raw as *mut ANativeWindow, + } + } } impl NativeConnection { diff --git a/surfman/src/platform/generic/multi/connection.rs b/surfman/src/platform/generic/multi/connection.rs index 6166c6d..571b98a 100644 --- a/surfman/src/platform/generic/multi/connection.rs +++ b/surfman/src/platform/generic/multi/connection.rs @@ -9,6 +9,10 @@ use crate::device::Device as DeviceInterface; use super::device::{Adapter, Device, NativeDevice}; use super::surface::NativeWidget; +use euclid::default::Size2D; + +use std::os::raw::c_void; + #[cfg(feature = "sm-winit")] use winit::Window; @@ -199,6 +203,18 @@ impl Connection } } } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, size: Size2D) -> NativeWidget { + match *self { + Connection::Default(ref connection) => { + NativeWidget::Default(connection.create_native_widget_from_ptr(raw, size)) + } + Connection::Alternate(ref connection) => { + NativeWidget::Alternate(connection.create_native_widget_from_ptr(raw, size)) + } + } + } } impl ConnectionInterface for Connection @@ -269,4 +285,9 @@ impl ConnectionInterface for Connection -> Result { Connection::create_native_widget_from_winit_window(self, window) } + + #[inline] + unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, size: Size2D) -> NativeWidget { + Connection::create_native_widget_from_ptr(self, raw, size) + } } diff --git a/surfman/src/platform/macos/cgl/connection.rs b/surfman/src/platform/macos/cgl/connection.rs index 213a474..19b4032 100644 --- a/surfman/src/platform/macos/cgl/connection.rs +++ b/surfman/src/platform/macos/cgl/connection.rs @@ -12,6 +12,10 @@ use crate::platform::macos::system::device::NativeDevice; use crate::platform::macos::system::surface::NativeWidget; use super::device::{Adapter, Device}; +use euclid::default::Size2D; + +use std::os::raw::c_void; + #[cfg(feature = "sm-winit")] use winit::Window; @@ -103,4 +107,9 @@ impl Connection { -> Result { self.0.create_native_widget_from_winit_window(window) } + + /// Creates a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, size: Size2D) -> NativeWidget { + self.0.create_native_widget_from_ptr(raw, size) + } } diff --git a/surfman/src/platform/macos/system/connection.rs b/surfman/src/platform/macos/system/connection.rs index 8f22543..a102117 100644 --- a/surfman/src/platform/macos/system/connection.rs +++ b/surfman/src/platform/macos/system/connection.rs @@ -16,7 +16,11 @@ use core_foundation::bundle::CFBundleGetInfoDictionary; use core_foundation::bundle::CFBundleGetMainBundle; use core_foundation::dictionary::{CFMutableDictionary, CFMutableDictionaryRef}; use core_foundation::string::CFString; + +use euclid::default::Size2D; + use std::str::FromStr; +use std::os::raw::c_void; #[cfg(feature = "sm-winit")] use winit::Window; @@ -134,6 +138,13 @@ impl Connection { Ok(NativeWidget { view: NSView(msg_send![ns_view, retain]) }) } } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, _size: Size2D) -> NativeWidget { + NativeWidget { + view: NSView(raw as id), + } + } } impl NativeConnection { diff --git a/surfman/src/platform/unix/generic/connection.rs b/surfman/src/platform/unix/generic/connection.rs index 38cd55c..99bc3be 100644 --- a/surfman/src/platform/unix/generic/connection.rs +++ b/surfman/src/platform/unix/generic/connection.rs @@ -11,6 +11,8 @@ use crate::platform::generic::egl::ffi::EGL_PLATFORM_SURFACELESS_MESA; use super::device::{Adapter, Device, NativeDevice}; use super::surface::NativeWidget; +use euclid::default::Size2D; + use std::os::raw::c_void; use std::sync::Arc; @@ -146,5 +148,10 @@ impl Connection { -> Result { Err(Error::IncompatibleNativeWidget) } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, _raw: *mut c_void, size: Size2D) -> NativeWidget { + NativeWidget + } } diff --git a/surfman/src/platform/unix/wayland/connection.rs b/surfman/src/platform/unix/wayland/connection.rs index 9bac7fe..f4dbcc5 100644 --- a/surfman/src/platform/unix/wayland/connection.rs +++ b/surfman/src/platform/unix/wayland/connection.rs @@ -179,6 +179,14 @@ impl Connection { Ok(NativeWidget { wayland_surface, size: window_size }) } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, size: Size2D) -> NativeWidget { + NativeWidget { + wayland_surface: raw as *mut wl_proxy, + size, + } + } } impl Drop for NativeConnectionWrapper { diff --git a/surfman/src/platform/unix/x11/connection.rs b/surfman/src/platform/unix/x11/connection.rs index 7d71767..e05828b 100644 --- a/surfman/src/platform/unix/x11/connection.rs +++ b/surfman/src/platform/unix/x11/connection.rs @@ -12,6 +12,8 @@ use crate::platform::unix::generic::device::Adapter; use super::device::{Device, NativeDevice}; use super::surface::NativeWidget; +use euclid::default::Size2D; + use std::marker::PhantomData; use std::os::raw::c_void; use std::ptr; @@ -208,6 +210,13 @@ impl Connection { None => Err(Error::IncompatibleNativeWidget), } } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, _size: Size2D) -> NativeWidget { + NativeWidget { + window: std::mem::transmute(raw), + } + } } impl NativeConnectionWrapper { diff --git a/surfman/src/platform/windows/angle/connection.rs b/surfman/src/platform/windows/angle/connection.rs index fce638a..417f2fd 100644 --- a/surfman/src/platform/windows/angle/connection.rs +++ b/surfman/src/platform/windows/angle/connection.rs @@ -13,6 +13,10 @@ use crate::GLApi; use super::device::{Adapter, Device, NativeDevice, VendorPreference}; use super::surface::NativeWidget; +use euclid::default::Size2D; + +use std::os::raw::c_void; + use winapi::shared::minwindef::UINT; use winapi::um::d3dcommon::{D3D_DRIVER_TYPE_UNKNOWN, D3D_DRIVER_TYPE_WARP}; @@ -121,7 +125,8 @@ impl Connection { /// Creates a native widget type from the given `winit` window. /// /// This type can be later used to create surfaces that render to the window. - #[cfg(feature = "sm-winit")] + // This is not implemented for UWP + #[cfg(all(feature = "sm-winit", not(target_vendor = "uwp")))] #[inline] pub fn create_native_widget_from_winit_window(&self, window: &Window) -> Result { @@ -132,6 +137,13 @@ impl Connection { Ok(NativeWidget { egl_native_window: hwnd }) } } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, _size: Size2D) -> NativeWidget { + NativeWidget { + egl_native_window: raw as EGLNativeWindowType, + } + } } impl NativeConnection { diff --git a/surfman/src/platform/windows/wgl/connection.rs b/surfman/src/platform/windows/wgl/connection.rs index e28cdc5..5200046 100644 --- a/surfman/src/platform/windows/wgl/connection.rs +++ b/surfman/src/platform/windows/wgl/connection.rs @@ -9,6 +9,10 @@ use crate::GLApi; use super::device::{Adapter, Device, NativeDevice}; use super::surface::NativeWidget; +use euclid::default::Size2D; + +use std::os::raw::c_void; + use winapi::shared::windef::HWND; #[cfg(feature = "sm-winit")] @@ -118,6 +122,13 @@ impl Connection { Ok(NativeWidget { window_handle: hwnd }) } } + + /// Create a native widget from a raw pointer + pub unsafe fn create_native_widget_from_ptr(&self, raw: *mut c_void, _size: Size2D) -> NativeWidget { + NativeWidget { + window_handle: raw as HWND, + } + } } impl NativeConnection {