From f1e20a61f16388ed4d2dac734bab30d67bbd84b3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 9 Feb 2020 03:25:13 +0100 Subject: Allow `iced_wgpu` to render to any `TextureView` --- wgpu/src/window/backend.rs | 99 +++++++++++++++++++++++++++++++++++++++++++ wgpu/src/window/swap_chain.rs | 49 +++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 wgpu/src/window/backend.rs create mode 100644 wgpu/src/window/swap_chain.rs (limited to 'wgpu/src/window') diff --git a/wgpu/src/window/backend.rs b/wgpu/src/window/backend.rs new file mode 100644 index 00000000..fda34a0a --- /dev/null +++ b/wgpu/src/window/backend.rs @@ -0,0 +1,99 @@ +use crate::{window::SwapChain, Renderer, Settings, Target}; + +use iced_native::MouseCursor; +use raw_window_handle::HasRawWindowHandle; + +#[derive(Debug)] +pub struct Backend { + device: wgpu::Device, + queue: wgpu::Queue, +} + +impl iced_native::window::Backend for Backend { + type Settings = Settings; + type Renderer = Renderer; + type Surface = wgpu::Surface; + type SwapChain = SwapChain; + + fn new(settings: Self::Settings) -> (Backend, Renderer) { + let adapter = wgpu::Adapter::request(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::Default, + backends: wgpu::BackendBit::all(), + }) + .expect("Request adapter"); + + let (mut device, queue) = + adapter.request_device(&wgpu::DeviceDescriptor { + extensions: wgpu::Extensions { + anisotropic_filtering: false, + }, + limits: wgpu::Limits { max_bind_groups: 2 }, + }); + + let renderer = Renderer::new(settings, &mut device); + + (Backend { device, queue }, renderer) + } + + fn create_surface( + &mut self, + window: &W, + ) -> wgpu::Surface { + wgpu::Surface::create(window) + } + + fn create_swap_chain( + &mut self, + surface: &Self::Surface, + width: u32, + height: u32, + scale_factor: f64, + ) -> SwapChain { + SwapChain::new(&self.device, surface, width, height, scale_factor) + } + + fn draw>( + &mut self, + renderer: &mut Self::Renderer, + swap_chain: &mut SwapChain, + output: &::Output, + overlay: &[T], + ) -> MouseCursor { + let (frame, viewport) = swap_chain.next_frame(); + + let mut encoder = self.device.create_command_encoder( + &wgpu::CommandEncoderDescriptor { todo: 0 }, + ); + + let _ = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor { + attachment: &frame.view, + resolve_target: None, + load_op: wgpu::LoadOp::Clear, + store_op: wgpu::StoreOp::Store, + clear_color: wgpu::Color { + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + }, + }], + depth_stencil_attachment: None, + }); + + let mouse_cursor = renderer.draw( + &mut self.device, + &mut encoder, + Target { + texture: &frame.view, + viewport, + }, + output, + overlay, + ); + + self.queue.submit(&[encoder.finish()]); + + mouse_cursor + } +} diff --git a/wgpu/src/window/swap_chain.rs b/wgpu/src/window/swap_chain.rs new file mode 100644 index 00000000..46aaa869 --- /dev/null +++ b/wgpu/src/window/swap_chain.rs @@ -0,0 +1,49 @@ +use crate::Viewport; + +/// The rendering target of a window. +/// +/// It represents a series of virtual framebuffers with a scale factor. +#[derive(Debug)] +pub struct SwapChain { + raw: wgpu::SwapChain, + viewport: Viewport, +} + +impl SwapChain {} + +impl SwapChain { + pub fn new( + device: &wgpu::Device, + surface: &wgpu::Surface, + width: u32, + height: u32, + scale_factor: f64, + ) -> SwapChain { + SwapChain { + raw: new_swap_chain(surface, width, height, device), + viewport: Viewport::new(width, height, scale_factor), + } + } + + pub fn next_frame(&mut self) -> (wgpu::SwapChainOutput<'_>, &Viewport) { + (self.raw.get_next_texture(), &self.viewport) + } +} + +fn new_swap_chain( + surface: &wgpu::Surface, + width: u32, + height: u32, + device: &wgpu::Device, +) -> wgpu::SwapChain { + device.create_swap_chain( + &surface, + &wgpu::SwapChainDescriptor { + usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT, + format: wgpu::TextureFormat::Bgra8UnormSrgb, + width, + height, + present_mode: wgpu::PresentMode::Vsync, + }, + ) +} -- cgit From 8f0b59a4b28bee028a879b0705eeeaa0b2e82df6 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 9 Feb 2020 03:36:59 +0100 Subject: Remove `scale_factor` from `iced_wgpu::Viewport` --- wgpu/src/window/backend.rs | 5 +++-- wgpu/src/window/swap_chain.rs | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'wgpu/src/window') diff --git a/wgpu/src/window/backend.rs b/wgpu/src/window/backend.rs index fda34a0a..0e4f02c9 100644 --- a/wgpu/src/window/backend.rs +++ b/wgpu/src/window/backend.rs @@ -47,9 +47,8 @@ impl iced_native::window::Backend for Backend { surface: &Self::Surface, width: u32, height: u32, - scale_factor: f64, ) -> SwapChain { - SwapChain::new(&self.device, surface, width, height, scale_factor) + SwapChain::new(&self.device, surface, width, height) } fn draw>( @@ -57,6 +56,7 @@ impl iced_native::window::Backend for Backend { renderer: &mut Self::Renderer, swap_chain: &mut SwapChain, output: &::Output, + scale_factor: f64, overlay: &[T], ) -> MouseCursor { let (frame, viewport) = swap_chain.next_frame(); @@ -89,6 +89,7 @@ impl iced_native::window::Backend for Backend { viewport, }, output, + scale_factor, overlay, ); diff --git a/wgpu/src/window/swap_chain.rs b/wgpu/src/window/swap_chain.rs index 46aaa869..3760e8a2 100644 --- a/wgpu/src/window/swap_chain.rs +++ b/wgpu/src/window/swap_chain.rs @@ -17,11 +17,10 @@ impl SwapChain { surface: &wgpu::Surface, width: u32, height: u32, - scale_factor: f64, ) -> SwapChain { SwapChain { raw: new_swap_chain(surface, width, height, device), - viewport: Viewport::new(width, height, scale_factor), + viewport: Viewport::new(width, height), } } -- cgit From 9a73c3a88d92262b4e59c1f061b1c56e533e2b0b Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 9 Feb 2020 03:44:16 +0100 Subject: Write documentation for new `iced_wgpu` types --- wgpu/src/window/backend.rs | 1 + wgpu/src/window/swap_chain.rs | 7 +++++++ 2 files changed, 8 insertions(+) (limited to 'wgpu/src/window') diff --git a/wgpu/src/window/backend.rs b/wgpu/src/window/backend.rs index 0e4f02c9..87779bea 100644 --- a/wgpu/src/window/backend.rs +++ b/wgpu/src/window/backend.rs @@ -3,6 +3,7 @@ use crate::{window::SwapChain, Renderer, Settings, Target}; use iced_native::MouseCursor; use raw_window_handle::HasRawWindowHandle; +/// A window graphics backend for iced powered by `wgpu`. #[derive(Debug)] pub struct Backend { device: wgpu::Device, diff --git a/wgpu/src/window/swap_chain.rs b/wgpu/src/window/swap_chain.rs index 3760e8a2..6f545fce 100644 --- a/wgpu/src/window/swap_chain.rs +++ b/wgpu/src/window/swap_chain.rs @@ -12,6 +12,9 @@ pub struct SwapChain { impl SwapChain {} impl SwapChain { + /// Creates a new [`SwapChain`] for the given surface. + /// + /// [`SwapChain`]: struct.SwapChain.html pub fn new( device: &wgpu::Device, surface: &wgpu::Surface, @@ -24,6 +27,10 @@ impl SwapChain { } } + /// Returns the next frame of the [`SwapChain`] alongside its [`Viewport`]. + /// + /// [`SwapChain`]: struct.SwapChain.html + /// [`Viewport`]: ../struct.Viewport.html pub fn next_frame(&mut self) -> (wgpu::SwapChainOutput<'_>, &Viewport) { (self.raw.get_next_texture(), &self.viewport) } -- cgit From 5f89fab9d7575900b02e70f6d64cb3d8fbd45753 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 9 Feb 2020 05:31:42 +0100 Subject: Improve consistency in new `iced_wgpu` types --- wgpu/src/window/backend.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wgpu/src/window') diff --git a/wgpu/src/window/backend.rs b/wgpu/src/window/backend.rs index 87779bea..6f8a0bb0 100644 --- a/wgpu/src/window/backend.rs +++ b/wgpu/src/window/backend.rs @@ -31,7 +31,7 @@ impl iced_native::window::Backend for Backend { limits: wgpu::Limits { max_bind_groups: 2 }, }); - let renderer = Renderer::new(settings, &mut device); + let renderer = Renderer::new(&mut device, settings); (Backend { device, queue }, renderer) } -- cgit