use alloc::{vec, vec::Vec};
use crate::{link_to_wgpu_docs, link_to_wgpu_item, TextureFormat, TextureUsages};
#[cfg(any(feature = "serde", test))]
use serde::{Deserialize, Serialize};
#[doc = link_to_wgpu_docs!(["presented"]: "struct.SurfaceTexture.html#method.present")]
#[doc = link_to_wgpu_docs!(["`SurfaceTexture::present()`"]: "struct.SurfaceTexture.html#method.present")]
#[repr(C)]
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum PresentMode {
AutoVsync = 0,
AutoNoVsync = 1,
#[doc = link_to_wgpu_docs!(["`Surface::get_current_texture()`"]: "struct.Surface.html#method.get_current_texture")]
#[default]
Fifo = 2,
#[doc = link_to_wgpu_docs!(["`Surface::get_current_texture()`"]: "struct.Surface.html#method.get_current_texture")]
FifoRelaxed = 3,
Immediate = 4,
Mailbox = 5,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))]
pub enum CompositeAlphaMode {
#[default]
Auto = 0,
Opaque = 1,
PreMultiplied = 2,
PostMultiplied = 3,
Inherit = 4,
}
#[derive(Debug)]
pub struct SurfaceCapabilities {
pub formats: Vec<TextureFormat>,
pub present_modes: Vec<PresentMode>,
pub alpha_modes: Vec<CompositeAlphaMode>,
pub usages: TextureUsages,
}
impl Default for SurfaceCapabilities {
fn default() -> Self {
Self {
formats: Vec::new(),
present_modes: Vec::new(),
alpha_modes: vec![CompositeAlphaMode::Opaque],
usages: TextureUsages::RENDER_ATTACHMENT,
}
}
}
#[doc = link_to_wgpu_item!(struct Surface)]
#[repr(C)]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SurfaceConfiguration<V> {
pub usage: TextureUsages,
pub format: TextureFormat,
pub width: u32,
pub height: u32,
pub present_mode: PresentMode,
#[doc = link_to_wgpu_docs!(["`Surface::get_current_texture`"]: "struct.Surface.html#method.get_current_texture")]
#[doc = link_to_wgpu_docs!(["`Surface::get_default_config`"]: "struct.Surface.html#method.get_default_config")]
pub desired_maximum_frame_latency: u32,
pub alpha_mode: CompositeAlphaMode,
pub view_formats: V,
}
impl<V: Clone> SurfaceConfiguration<V> {
pub fn map_view_formats<M>(&self, fun: impl FnOnce(V) -> M) -> SurfaceConfiguration<M> {
SurfaceConfiguration {
usage: self.usage,
format: self.format,
width: self.width,
height: self.height,
present_mode: self.present_mode,
desired_maximum_frame_latency: self.desired_maximum_frame_latency,
alpha_mode: self.alpha_mode,
view_formats: fun(self.view_formats.clone()),
}
}
}
#[repr(C)]
#[derive(Debug)]
pub enum SurfaceStatus {
Good,
Suboptimal,
Timeout,
Occluded,
Outdated,
Lost,
Validation,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct PresentationTimestamp(
pub u128,
);
impl PresentationTimestamp {
pub const INVALID_TIMESTAMP: Self = Self(u128::MAX);
#[must_use]
pub fn is_invalid(self) -> bool {
self == Self::INVALID_TIMESTAMP
}
}