summaryrefslogtreecommitdiffstats
path: root/wgpu/src/renderer/target.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-02 20:20:35 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-02 20:20:35 +0100
commitef056d84890e745010675e70f734f882f89356c2 (patch)
tree000d021f26027f2c2fafcdb9d91c9f4b55f7893e /wgpu/src/renderer/target.rs
parent58e04af824a64d9f712a2d6691d4283888d271d3 (diff)
downloadiced-ef056d84890e745010675e70f734f882f89356c2.tar.gz
iced-ef056d84890e745010675e70f734f882f89356c2.tar.bz2
iced-ef056d84890e745010675e70f734f882f89356c2.zip
Move `Target` to its own module
Diffstat (limited to 'wgpu/src/renderer/target.rs')
-rw-r--r--wgpu/src/renderer/target.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/wgpu/src/renderer/target.rs b/wgpu/src/renderer/target.rs
new file mode 100644
index 00000000..d9d05bf0
--- /dev/null
+++ b/wgpu/src/renderer/target.rs
@@ -0,0 +1,74 @@
+use crate::{Renderer, Transformation};
+
+use raw_window_handle::HasRawWindowHandle;
+
+pub struct Target {
+ surface: wgpu::Surface,
+ width: u16,
+ height: u16,
+ transformation: Transformation,
+ swap_chain: wgpu::SwapChain,
+}
+
+impl Target {
+ pub fn dimensions(&self) -> (u16, u16) {
+ (self.width, self.height)
+ }
+
+ pub fn transformation(&self) -> Transformation {
+ self.transformation
+ }
+
+ pub fn next_frame(&mut self) -> wgpu::SwapChainOutput {
+ self.swap_chain.get_next_texture()
+ }
+}
+
+impl iced_native::renderer::Target for Target {
+ type Renderer = Renderer;
+
+ fn new<W: HasRawWindowHandle>(
+ window: &W,
+ width: u16,
+ height: u16,
+ renderer: &Renderer,
+ ) -> Target {
+ let surface = wgpu::Surface::create(window);
+ let swap_chain =
+ new_swap_chain(&surface, width, height, &renderer.device);
+
+ Target {
+ surface,
+ width,
+ height,
+ transformation: Transformation::orthographic(width, height),
+ swap_chain,
+ }
+ }
+
+ fn resize(&mut self, width: u16, height: u16, renderer: &Renderer) {
+ self.width = width;
+ self.height = height;
+ self.transformation = Transformation::orthographic(width, height);
+ self.swap_chain =
+ new_swap_chain(&self.surface, width, height, &renderer.device);
+ }
+}
+
+fn new_swap_chain(
+ surface: &wgpu::Surface,
+ width: u16,
+ height: u16,
+ device: &wgpu::Device,
+) -> wgpu::SwapChain {
+ device.create_swap_chain(
+ &surface,
+ &wgpu::SwapChainDescriptor {
+ usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT,
+ format: wgpu::TextureFormat::Bgra8UnormSrgb,
+ width: u32::from(width),
+ height: u32::from(height),
+ present_mode: wgpu::PresentMode::Vsync,
+ },
+ )
+}