Skip to main content

diene_engine_renderer_api/
lib.rs

1//! Shared renderer abstraction used by engine orchestration and backends.
2
3#![forbid(unsafe_code)]
4
5use std::{error::Error, fmt::Debug};
6
7pub use raw_window_handle::{DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, WindowHandle};
8
9/// Drawable size in physical pixels.
10#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
11pub struct RenderExtent {
12    /// Drawable width in pixels.
13    pub width: u32,
14
15    /// Drawable height in pixels.
16    pub height: u32,
17}
18
19impl RenderExtent {
20    /// Creates a drawable extent in physical pixels.
21    pub const fn new(width: u32, height: u32) -> Self {
22        Self { width, height }
23    }
24
25    /// Returns `true` when either dimension is zero.
26    pub const fn is_empty(self) -> bool {
27        self.width == 0 || self.height == 0
28    }
29}
30
31/// Native window data needed by renderer backends.
32pub trait RenderWindow: Debug + HasDisplayHandle + HasWindowHandle {
33    /// Returns the current drawable window size in physical pixels.
34    fn size(&self) -> RenderExtent;
35}
36
37/// Renderer backend operations driven by the application loop.
38pub trait Renderer: Debug {
39    /// Error type returned by renderer operations.
40    type Error: Error + Send + Sync + 'static;
41
42    /// Prepares renderer-owned state for the next frame.
43    fn prepare_frame(&mut self) -> Result<(), Self::Error>;
44
45    /// Renders one frame.
46    fn render(&mut self) -> Result<(), Self::Error>;
47
48    /// Resizes renderer-owned swapchain or framebuffer resources.
49    fn resize(&mut self, extent: RenderExtent) -> Result<(), Self::Error>;
50}
51
52/// Owned renderer trait object with a fixed error type.
53pub type BoxedRenderer<E> = Box<dyn Renderer<Error = E>>;
54
55/// Creates renderer instances once a native window exists.
56pub trait RendererFactory: Debug {
57    /// Error type returned by renderer creation and operations.
58    type Error: Error + Send + Sync + 'static;
59
60    /// Creates a renderer for the supplied native window.
61    fn create_renderer(&mut self, window: &dyn RenderWindow) -> Result<BoxedRenderer<Self::Error>, Self::Error>;
62}