Skip to main content

kozan_platform/renderer/
surface.rs

1//! `RenderSurface` — the per-window rendering target.
2//!
3//! Chrome: `viz::OutputSurface` / `cc::OutputSurface`.
4//!
5//! A `RenderSurface` is created once per OS window by the `Renderer`.
6//! It owns the GPU swap chain for that window and renders one frame at a time.
7
8use kozan_core::compositor::frame::CompositorFrame;
9
10use super::error::RendererError;
11
12/// Everything the renderer needs to produce one frame of pixels.
13pub struct RenderParams<'a> {
14    /// Compositor output: display list + scroll adjustments.
15    pub frame: &'a CompositorFrame,
16    /// Viewport width in physical pixels.
17    pub width: u32,
18    /// Viewport height in physical pixels.
19    pub height: u32,
20    /// DPI scale — logical pixels × scale_factor = physical pixels.
21    pub scale_factor: f64,
22}
23
24/// A per-window GPU rendering target.
25///
26/// Implemented by the renderer backend (e.g., `kozan-vello::VelloSurface`).
27/// One `RenderSurface` per OS window.
28pub trait RenderSurface: Send {
29    fn render(&mut self, params: &RenderParams) -> Result<(), RendererError>;
30
31    /// Notify the surface that the window was resized.
32    fn resize(&mut self, width: u32, height: u32);
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn render_surface_is_object_safe() {
41        fn _accepts_dyn(_s: &dyn RenderSurface) {}
42    }
43
44    #[test]
45    fn render_surface_requires_send() {
46        fn _assert_send<T: Send>() {}
47        fn _check<S: RenderSurface>() {
48            _assert_send::<S>();
49        }
50    }
51}