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}