diff options
author | 2019-11-02 20:20:35 +0100 | |
---|---|---|
committer | 2019-11-02 20:20:35 +0100 | |
commit | ef056d84890e745010675e70f734f882f89356c2 (patch) | |
tree | 000d021f26027f2c2fafcdb9d91c9f4b55f7893e /wgpu/src/renderer/target.rs | |
parent | 58e04af824a64d9f712a2d6691d4283888d271d3 (diff) | |
download | iced-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.rs | 74 |
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, + }, + ) +} |