diff options
| author | 2020-02-09 03:25:13 +0100 | |
|---|---|---|
| committer | 2020-02-09 03:25:13 +0100 | |
| commit | f1e20a61f16388ed4d2dac734bab30d67bbd84b3 (patch) | |
| tree | e4112411df1b0493ecb34aa75ecd04e92e9a82af /native/src/window | |
| parent | 95880ca74bddb6a23774621ef766b91956d40a61 (diff) | |
| download | iced-f1e20a61f16388ed4d2dac734bab30d67bbd84b3.tar.gz iced-f1e20a61f16388ed4d2dac734bab30d67bbd84b3.tar.bz2 iced-f1e20a61f16388ed4d2dac734bab30d67bbd84b3.zip  | |
Allow `iced_wgpu` to render to any `TextureView`
Diffstat (limited to '')
| -rw-r--r-- | native/src/window.rs | 4 | ||||
| -rw-r--r-- | native/src/window/backend.rs | 55 | ||||
| -rw-r--r-- | native/src/window/renderer.rs | 73 | 
3 files changed, 92 insertions, 40 deletions
diff --git a/native/src/window.rs b/native/src/window.rs index db9226dc..4dcae62f 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -1,6 +1,6 @@  //! Build window-based GUI applications. +mod backend;  mod event; -mod renderer; +pub use backend::Backend;  pub use event::Event; -pub use renderer::{Renderer, Target}; diff --git a/native/src/window/backend.rs b/native/src/window/backend.rs new file mode 100644 index 00000000..690dbdab --- /dev/null +++ b/native/src/window/backend.rs @@ -0,0 +1,55 @@ +use crate::MouseCursor; + +use raw_window_handle::HasRawWindowHandle; + +/// A graphics backend that can render to windows. +pub trait Backend: Sized { +    /// The settings of the backend. +    type Settings: Default; + +    /// The iced renderer of the backend. +    type Renderer: crate::Renderer; + +    /// The surface of the backend. +    type Surface; + +    /// The swap chain of the backend. +    type SwapChain; + +    /// Creates a new [`Backend`] and an associated iced renderer. +    /// +    /// [`Backend`]: trait.Backend.html +    fn new(settings: Self::Settings) -> (Self, Self::Renderer); + +    /// Crates a new [`Surface`] for the given window. +    /// +    /// [`Surface`]: #associatedtype.Surface +    fn create_surface<W: HasRawWindowHandle>( +        &mut self, +        window: &W, +    ) -> Self::Surface; + +    /// Crates a new [`SwapChain`] for the given [`Surface`]. +    /// +    /// [`SwapChain`]: #associatedtype.SwapChain +    /// [`Surface`]: #associatedtype.Surface +    fn create_swap_chain( +        &mut self, +        surface: &Self::Surface, +        width: u32, +        height: u32, +        scale_factor: f64, +    ) -> Self::SwapChain; + +    /// Draws the output primitives to the next frame of the given [`SwapChain`]. +    /// +    /// [`SwapChain`]: #associatedtype.SwapChain +    /// [`Surface`]: #associatedtype.Surface +    fn draw<T: AsRef<str>>( +        &mut self, +        renderer: &mut Self::Renderer, +        swap_chain: &mut Self::SwapChain, +        output: &<Self::Renderer as crate::Renderer>::Output, +        overlay: &[T], +    ) -> MouseCursor; +} diff --git a/native/src/window/renderer.rs b/native/src/window/renderer.rs index a3cbb8ce..b0cc0134 100644 --- a/native/src/window/renderer.rs +++ b/native/src/window/renderer.rs @@ -2,57 +2,54 @@ use crate::MouseCursor;  use raw_window_handle::HasRawWindowHandle; -/// A renderer that can target windows. -pub trait Renderer: crate::Renderer + Sized { -    /// The settings of the renderer. +/// A graphics backend that can render to windows. +pub trait Backend: Sized { +    /// The settings of the backend.      type Settings: Default; -    /// The type of target. -    type Target: Target<Renderer = Self>; +    /// The iced renderer of the backend. +    type Renderer: crate::Renderer; -    /// Creates a new window [`Renderer`]. +    /// The surface of the backend. +    type Surface; + +    /// The target of the backend. +    type Target; + +    /// Creates a new [`Gpu`] and an associated iced renderer.      /// -    /// [`Renderer`]: trait.Renderer.html -    fn new(settings: Self::Settings) -> Self; +    /// [`Gpu`]: trait.Gpu.html +    fn new(settings: Self::Settings) -> (Self, Self::Renderer); -    /// Performs the drawing operations described in the output on the given -    /// target. +    /// Crates a new [`Surface`] for the given window.      /// -    /// The overlay can be a bunch of debug text logs. It should be rendered on -    /// top of the GUI on most scenarios. -    fn draw<T: AsRef<str>>( +    /// [`Surface`]: #associatedtype.Surface +    fn create_surface<W: HasRawWindowHandle>(          &mut self, -        output: &Self::Output, -        overlay: &[T], -        target: &mut Self::Target, -    ) -> MouseCursor; -} - -/// A rendering target. -pub trait Target { -    /// The renderer of this target. -    type Renderer; +        window: &W, +    ) -> Self::Surface; -    /// Creates a new rendering [`Target`] from the given window handle, width, -    /// height and dpi factor. +    /// Crates a new [`Target`] for the given [`Surface`].      /// -    /// [`Target`]: trait.Target.html -    fn new<W: HasRawWindowHandle>( -        window: &W, +    /// [`Target`]: #associatedtype.Target +    /// [`Surface`]: #associatedtype.Surface +    fn create_target( +        &mut self, +        surface: &Self::Surface,          width: u32,          height: u32,          scale_factor: f64, -        renderer: &Self::Renderer, -    ) -> Self; +    ) -> Self::Target; -    /// Resizes the current [`Target`]. +    /// Draws the output primitives to the given [`Target`].      /// -    /// [`Target`]: trait.Target.html -    fn resize( +    /// [`Target`]: #associatedtype.Target +    /// [`Surface`]: #associatedtype.Surface +    fn draw<T: AsRef<str>>(          &mut self, -        width: u32, -        height: u32, -        scale_factor: f64, -        renderer: &Self::Renderer, -    ); +        renderer: &mut Self::Renderer, +        target: &mut Self::Target, +        output: &<Self::Renderer as crate::Renderer>::Output, +        overlay: &[T], +    ) -> MouseCursor;  }  | 
