summaryrefslogtreecommitdiffstats
path: root/native/src/window
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-02-09 03:25:13 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-02-09 03:25:13 +0100
commitf1e20a61f16388ed4d2dac734bab30d67bbd84b3 (patch)
treee4112411df1b0493ecb34aa75ecd04e92e9a82af /native/src/window
parent95880ca74bddb6a23774621ef766b91956d40a61 (diff)
downloadiced-f1e20a61f16388ed4d2dac734bab30d67bbd84b3.tar.gz
iced-f1e20a61f16388ed4d2dac734bab30d67bbd84b3.tar.bz2
iced-f1e20a61f16388ed4d2dac734bab30d67bbd84b3.zip
Allow `iced_wgpu` to render to any `TextureView`
Diffstat (limited to 'native/src/window')
-rw-r--r--native/src/window/backend.rs55
-rw-r--r--native/src/window/renderer.rs73
2 files changed, 90 insertions, 38 deletions
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;
}