add more supported egl platforms
This commit is contained in:
parent
2e55501dea
commit
af66a9c152
2
build.rs
2
build.rs
|
@ -18,7 +18,9 @@ fn gl_generate() {
|
||||||
"EGL_KHR_create_context_no_error",
|
"EGL_KHR_create_context_no_error",
|
||||||
"EGL_KHR_no_config_context",
|
"EGL_KHR_no_config_context",
|
||||||
"EGL_EXT_platform_base",
|
"EGL_EXT_platform_base",
|
||||||
|
"EGL_KHR_platform_x11",
|
||||||
"EGL_EXT_platform_x11",
|
"EGL_EXT_platform_x11",
|
||||||
|
"EGL_KHR_platform_wayland",
|
||||||
"EGL_EXT_platform_wayland",
|
"EGL_EXT_platform_wayland",
|
||||||
"EGL_KHR_platform_gbm",
|
"EGL_KHR_platform_gbm",
|
||||||
"EGL_MESA_platform_gbm",
|
"EGL_MESA_platform_gbm",
|
||||||
|
|
|
@ -16,6 +16,44 @@ use winit::window::Window as WinitWindow;
|
||||||
#[cfg(feature = "backend_gbm")]
|
#[cfg(feature = "backend_gbm")]
|
||||||
use gbm::{AsRaw, Device as GbmDevice};
|
use gbm::{AsRaw, Device as GbmDevice};
|
||||||
|
|
||||||
|
/// Create a `EGLPlatform<'a>` for the provided platform.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `platform` - The platform defined in `ffi::egl::`
|
||||||
|
/// * `native_display` - The native display raw pointer which can be casted to `*mut c_void`
|
||||||
|
/// * `required_extensions` - The name of the required EGL Extension for this platform
|
||||||
|
///
|
||||||
|
/// # Optional Arguments
|
||||||
|
/// * `attrib_list` - A list of `ffi::EGLint` like defined in the EGL Extension
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// // see: https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_platform_gbm.txt
|
||||||
|
/// egl_platform!(PLATFORM_GBM_KHR, self.as_raw(), &["EGL_KHR_platform_gbm"])
|
||||||
|
/// ```
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! egl_platform {
|
||||||
|
($platform:ident, $native_display:expr, $required_extensions:expr) => {
|
||||||
|
egl_platform!(
|
||||||
|
$platform,
|
||||||
|
$native_display,
|
||||||
|
$required_extensions,
|
||||||
|
vec![ffi::egl::NONE as ffi::EGLint]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
($platform:ident, $native_display:expr, $required_extensions:expr, $attrib_list:expr) => {
|
||||||
|
EGLPlatform::new(
|
||||||
|
ffi::egl::$platform,
|
||||||
|
stringify!($platform),
|
||||||
|
$native_display as *mut _,
|
||||||
|
$attrib_list,
|
||||||
|
$required_extensions,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/// Type, Raw handle and attributes used to call [`eglGetPlatformDisplayEXT`](https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_base.txt)
|
/// Type, Raw handle and attributes used to call [`eglGetPlatformDisplayEXT`](https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_base.txt)
|
||||||
pub struct EGLPlatform<'a> {
|
pub struct EGLPlatform<'a> {
|
||||||
/// Required extensions to use this platform
|
/// Required extensions to use this platform
|
||||||
|
@ -31,6 +69,40 @@ pub struct EGLPlatform<'a> {
|
||||||
_phantom: PhantomData<&'a c_void>,
|
_phantom: PhantomData<&'a c_void>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a> EGLPlatform<'a> {
|
||||||
|
/// Create a `EGLPlatform<'a>` for the provided platform.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `platform` - The platform defined in `ffi::egl::`
|
||||||
|
/// * `platform_name` - A human readable representation of the platform
|
||||||
|
/// * `native_display` - The native display raw pointer which can be casted to `*mut c_void`
|
||||||
|
/// * `attrib_list` - A list of `ffi::EGLint` like defined in the EGL Extension
|
||||||
|
/// * `required_extensions` - The names of the required EGL Extensions for this platform
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// EGLPlatform::new(ffi::egl::PLATFORM_GBM_KHR, display as *mut _, vec![ffi::egl::NONE as ffi::EGLint], &["EGL_KHR_platform_gbm"])
|
||||||
|
/// ```
|
||||||
|
pub fn new(
|
||||||
|
platform: ffi::egl::types::EGLenum,
|
||||||
|
platform_name: &'static str,
|
||||||
|
native_display: *mut c_void,
|
||||||
|
attrib_list: Vec<ffi::EGLint>,
|
||||||
|
required_extensions: &'static [&'static str],
|
||||||
|
) -> Self {
|
||||||
|
EGLPlatform {
|
||||||
|
platform,
|
||||||
|
platform_name,
|
||||||
|
native_display,
|
||||||
|
attrib_list,
|
||||||
|
required_extensions,
|
||||||
|
_phantom: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> Debug for EGLPlatform<'a> {
|
impl<'a> Debug for EGLPlatform<'a> {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
f.debug_struct("EGLPlatform")
|
f.debug_struct("EGLPlatform")
|
||||||
|
@ -42,7 +114,7 @@ impl<'a> Debug for EGLPlatform<'a> {
|
||||||
|
|
||||||
/// Trait describing platform specific functionality to create a valid `EGLDisplay` using the `EGL_EXT_platform_base`(https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_base.txt) extension.
|
/// Trait describing platform specific functionality to create a valid `EGLDisplay` using the `EGL_EXT_platform_base`(https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_base.txt) extension.
|
||||||
pub trait EGLNativeDisplay: Send {
|
pub trait EGLNativeDisplay: Send {
|
||||||
/// List of supported platforms that can be used to create a display using [`eglGetPlatformDisplayEXT`](https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_base.txt)
|
/// List of supported platforms that can be used to create a display using [`eglGetPlatformDisplayEXT`](https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_base.txt)
|
||||||
fn supported_platforms<'a>(&'a self) -> Vec<EGLPlatform<'a>>;
|
fn supported_platforms<'a>(&'a self) -> Vec<EGLPlatform<'a>>;
|
||||||
|
|
||||||
/// Type of surfaces created
|
/// Type of surfaces created
|
||||||
|
@ -55,22 +127,10 @@ pub trait EGLNativeDisplay: Send {
|
||||||
impl<A: AsRawFd + Send + 'static> EGLNativeDisplay for GbmDevice<A> {
|
impl<A: AsRawFd + Send + 'static> EGLNativeDisplay for GbmDevice<A> {
|
||||||
fn supported_platforms<'a>(&'a self) -> Vec<EGLPlatform<'a>> {
|
fn supported_platforms<'a>(&'a self) -> Vec<EGLPlatform<'a>> {
|
||||||
vec![
|
vec![
|
||||||
EGLPlatform {
|
// see: https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_platform_gbm.txt
|
||||||
required_extensions: &["EGL_KHR_platform_gbm"],
|
egl_platform!(PLATFORM_GBM_KHR, self.as_raw(), &["EGL_KHR_platform_gbm"]),
|
||||||
platform_name: "PLATFORM_GBM_KHR",
|
// see: https://www.khronos.org/registry/EGL/extensions/MESA/EGL_MESA_platform_gbm.txt
|
||||||
platform: ffi::egl::PLATFORM_GBM_KHR,
|
egl_platform!(PLATFORM_GBM_MESA, self.as_raw(), &["EGL_MESA_platform_gbm"]),
|
||||||
native_display: self.as_raw() as *mut _,
|
|
||||||
attrib_list: vec![ffi::egl::NONE as ffi::EGLint],
|
|
||||||
_phantom: PhantomData,
|
|
||||||
},
|
|
||||||
EGLPlatform {
|
|
||||||
required_extensions: &["EGL_MESA_platform_gbm"],
|
|
||||||
platform_name: "PLATFORM_GBM_MESA",
|
|
||||||
platform: ffi::egl::PLATFORM_GBM_MESA,
|
|
||||||
native_display: self.as_raw() as *mut _,
|
|
||||||
attrib_list: vec![ffi::egl::NONE as ffi::EGLint],
|
|
||||||
_phantom: PhantomData,
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,23 +139,19 @@ impl<A: AsRawFd + Send + 'static> EGLNativeDisplay for GbmDevice<A> {
|
||||||
impl EGLNativeDisplay for WinitWindow {
|
impl EGLNativeDisplay for WinitWindow {
|
||||||
fn supported_platforms<'a>(&'a self) -> Vec<EGLPlatform<'a>> {
|
fn supported_platforms<'a>(&'a self) -> Vec<EGLPlatform<'a>> {
|
||||||
if let Some(display) = self.wayland_display() {
|
if let Some(display) = self.wayland_display() {
|
||||||
vec![EGLPlatform {
|
vec![
|
||||||
required_extensions: &["EGL_EXT_platform_wayland"],
|
// see: https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_platform_wayland.txt
|
||||||
platform_name: "PLATFORM_WAYLAND_EXT",
|
egl_platform!(PLATFORM_WAYLAND_KHR, display, &["EGL_KHR_platform_wayland"]),
|
||||||
platform: ffi::egl::PLATFORM_WAYLAND_EXT,
|
// see: https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_wayland.txt
|
||||||
native_display: display as *mut _,
|
egl_platform!(PLATFORM_WAYLAND_EXT, display, &["EGL_EXT_platform_wayland"]),
|
||||||
attrib_list: vec![ffi::egl::NONE as ffi::EGLint],
|
]
|
||||||
_phantom: PhantomData,
|
|
||||||
}]
|
|
||||||
} else if let Some(display) = self.xlib_display() {
|
} else if let Some(display) = self.xlib_display() {
|
||||||
vec![EGLPlatform {
|
vec![
|
||||||
required_extensions: &["EGL_EXT_platform_x11"],
|
// see: https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_platform_x11.txt
|
||||||
platform_name: "PLATFORM_X11_EXT",
|
egl_platform!(PLATFORM_X11_KHR, display, &["EGL_KHR_platform_x11"]),
|
||||||
platform: ffi::egl::PLATFORM_X11_EXT,
|
// see: https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_platform_x11.txt
|
||||||
native_display: display as *mut _,
|
egl_platform!(PLATFORM_X11_EXT, display, &["EGL_EXT_platform_x11"]),
|
||||||
attrib_list: vec![ffi::egl::NONE as ffi::EGLint],
|
]
|
||||||
_phantom: PhantomData,
|
|
||||||
}]
|
|
||||||
} else {
|
} else {
|
||||||
unreachable!("No backends for winit other then Wayland and X11 are supported")
|
unreachable!("No backends for winit other then Wayland and X11 are supported")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue