#[cfg(all(feature = "c-api", feature = "gpu"))]
pub mod applied_filter;
#[cfg(feature = "gpu")]
pub mod gpu_runtime;
#[cfg(feature = "gpu")]
pub mod gpu_surface;
#[cfg(all(feature = "c-api", feature = "gpu"))]
pub mod view_effect;
pub mod view_renderer;
#[cfg(feature = "gpu")]
fn acquire_surface_texture(
surface: &wgpu::Surface<'_>,
device: &wgpu::Device,
config: &wgpu::SurfaceConfiguration,
context: &'static str,
) -> Option<wgpu::SurfaceTexture> {
match checked_surface_acquire(surface, device) {
Ok(
wgpu::CurrentSurfaceTexture::Success(output)
| wgpu::CurrentSurfaceTexture::Suboptimal(output),
) => Some(output),
Ok(wgpu::CurrentSurfaceTexture::Lost | wgpu::CurrentSurfaceTexture::Outdated) => {
tracing::debug!(context, "surface lost or outdated; reconfiguring");
checked_surface_configure(surface, device, config, context);
match checked_surface_acquire(surface, device) {
Ok(
wgpu::CurrentSurfaceTexture::Success(output)
| wgpu::CurrentSurfaceTexture::Suboptimal(output),
) => Some(output),
Ok(wgpu::CurrentSurfaceTexture::Occluded) => {
tracing::debug!(context, "surface is occluded; skipping frame");
None
}
Ok(status) => panic!("{context}: acquire after reconfigure failed: {status:?}"),
Err(error) => {
panic!("{context}: acquire after reconfigure failed: {error} with {config:?}")
}
}
}
Ok(wgpu::CurrentSurfaceTexture::Timeout) => panic!("{context}: surface timeout"),
Ok(wgpu::CurrentSurfaceTexture::Occluded) => {
tracing::debug!(context, "surface is occluded; skipping frame");
None
}
Ok(wgpu::CurrentSurfaceTexture::Validation) => {
panic!("{context}: surface acquisition failed validation with {config:?}")
}
Err(error) => {
panic!("{context}: surface acquisition failed: {error} with {config:?}")
}
}
}
#[cfg(feature = "gpu")]
fn checked_surface_acquire(
surface: &wgpu::Surface<'_>,
device: &wgpu::Device,
) -> Result<wgpu::CurrentSurfaceTexture, wgpu::Error> {
let scope = device.push_error_scope(wgpu::ErrorFilter::Validation);
let status = surface.get_current_texture();
pollster::block_on(scope.pop()).map_or_else(|| Ok(status), Err)
}
#[cfg(feature = "gpu")]
pub fn checked_surface_configure(
surface: &wgpu::Surface<'_>,
device: &wgpu::Device,
config: &wgpu::SurfaceConfiguration,
context: &'static str,
) {
let scope = device.push_error_scope(wgpu::ErrorFilter::Validation);
surface.configure(device, config);
if let Some(error) = pollster::block_on(scope.pop()) {
panic!("{context}: surface configure failed: {error} with {config:?}");
}
}