pub use crate::backend::Surface;
use {
crate::{assert_error, format::Format, image::ImageUsage, Extent2d, OutOfMemory},
raw_window_handle::RawWindowHandle,
std::{error::Error, fmt::Debug, ops::RangeInclusive},
};
#[derive(Clone, Copy, Debug, thiserror::Error, PartialEq, Eq)]
pub enum SurfaceError {
#[error(transparent)]
OutOfMemory {
#[from]
source: OutOfMemory,
},
#[error("Surfaces are not supported")]
NotSupported,
#[error("Image usage {{{usage:?}}} is not supported for surface images")]
UsageNotSupported { usage: ImageUsage },
#[error("Surface was lost")]
SurfaceLost,
#[error("Format {{{format:?}}} is not supported for surface images")]
FormatUnsupported { format: Format },
#[error("Presentation mode {{{mode:?}}} is not supported for surface images")]
PresentModeUnsupported { mode: PresentMode },
#[error("Surface is already used")]
AlreadyUsed,
}
#[allow(dead_code)]
fn check_surface_error() {
assert_error::<SurfaceError>();
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde-1", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum RawWindowHandleKind {
IOS,
MacOS,
Xlib,
Xcb,
Wayland,
Windows,
Web,
Android,
Unknown,
}
impl RawWindowHandleKind {
pub fn of(window: &RawWindowHandle) -> Self {
match window {
#[cfg(target_os = "android")]
RawWindowHandle::Android(_) => RawWindowHandleKind::Android,
#[cfg(target_os = "ios")]
RawWindowHandle::IOS(_) => RawWindowHandleKind::IOS,
#[cfg(target_os = "macos")]
RawWindowHandle::MacOS(_) => RawWindowHandleKind::MacOS,
#[cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
RawWindowHandle::Wayland(_) => RawWindowHandleKind::Wayland,
#[cfg(target_os = "windows")]
RawWindowHandle::Windows(_) => RawWindowHandleKind::Windows,
#[cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
RawWindowHandle::Xcb(_) => RawWindowHandleKind::Xcb,
#[cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
RawWindowHandle::Xlib(_) => RawWindowHandleKind::Xlib,
_ => RawWindowHandleKind::Unknown,
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum CreateSurfaceError {
#[error(transparent)]
OutOfMemory {
#[from]
source: OutOfMemory,
},
#[error("Window handle of kind {{{window:?}}} is not supported")]
UnsupportedWindow {
window: RawWindowHandleKind,
#[source]
source: Option<Box<dyn Error + Send + Sync>>,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde-1", derive(serde::Serialize, serde::Deserialize))]
pub enum PresentMode {
Immediate,
Mailbox,
Fifo,
FifoRelaxed,
}
#[derive(Debug)]
#[cfg_attr(feature = "serde-1", derive(serde::Serialize, serde::Deserialize))]
pub struct SurfaceCapabilities {
pub families: Vec<usize>,
pub image_count: RangeInclusive<u32>,
pub current_extent: Extent2d,
pub image_extent: RangeInclusive<Extent2d>,
pub supported_usage: ImageUsage,
pub present_modes: Vec<PresentMode>,
pub formats: Vec<Format>,
}
#[derive(Clone, Copy, Debug)]
pub struct SurfaceInfo {
pub window: RawWindowHandle,
}
unsafe impl Send for SurfaceInfo {}
unsafe impl Sync for SurfaceInfo {}