From 58e04af824a64d9f712a2d6691d4283888d271d3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 2 Nov 2019 19:58:49 +0100 Subject: Draft `Metrics` and improve `Target` abstraction --- wgpu/src/renderer.rs | 84 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 30 deletions(-) (limited to 'wgpu/src/renderer.rs') diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index fbc39327..6e90c129 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -1,6 +1,6 @@ use crate::{quad, Image, Primitive, Quad, Transformation}; use iced_native::{ - renderer::Debugger, renderer::Windowed, Background, Color, Layout, + renderer::Debugger, renderer::Windowed, Background, Color, Layout, Metrics, MouseCursor, Point, Rectangle, Widget, }; @@ -26,7 +26,6 @@ mod text; mod text_input; pub struct Renderer { - surface: Surface, device: Device, queue: Queue, quad_pipeline: quad::Pipeline, @@ -36,12 +35,61 @@ pub struct Renderer { } pub struct Target { + surface: Surface, width: u16, height: u16, transformation: Transformation, swap_chain: SwapChain, } +impl iced_native::renderer::Target for Target { + type Renderer = Renderer; + + fn new( + window: &W, + width: u16, + height: u16, + renderer: &Renderer, + ) -> Target { + let surface = Surface::create(window); + + let swap_chain = renderer.device.create_swap_chain( + &surface, + &SwapChainDescriptor { + usage: TextureUsage::OUTPUT_ATTACHMENT, + format: TextureFormat::Bgra8UnormSrgb, + width: u32::from(width), + height: u32::from(height), + present_mode: wgpu::PresentMode::Vsync, + }, + ); + + 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 = renderer.device.create_swap_chain( + &self.surface, + &SwapChainDescriptor { + usage: TextureUsage::OUTPUT_ATTACHMENT, + format: TextureFormat::Bgra8UnormSrgb, + width: u32::from(width), + height: u32::from(height), + present_mode: wgpu::PresentMode::Vsync, + }, + ); + } +} + pub struct Layer<'a> { bounds: Rectangle, y_offset: u32, @@ -63,7 +111,7 @@ impl<'a> Layer<'a> { } impl Renderer { - fn new(window: &W) -> Self { + fn new() -> Self { let adapter = Adapter::request(&RequestAdapterOptions { power_preference: PowerPreference::LowPower, backends: BackendBit::all(), @@ -77,8 +125,6 @@ impl Renderer { limits: Limits { max_bind_groups: 2 }, }); - let surface = Surface::create(window); - // TODO: Think about font loading strategy // Loading system fonts with fallback may be a good idea let font: &[u8] = @@ -91,7 +137,6 @@ impl Renderer { let image_pipeline = crate::image::Pipeline::new(&mut device); Self { - surface, device, queue, quad_pipeline, @@ -101,24 +146,6 @@ impl Renderer { } } - fn target(&self, width: u16, height: u16) -> Target { - Target { - width, - height, - transformation: Transformation::orthographic(width, height), - swap_chain: self.device.create_swap_chain( - &self.surface, - &SwapChainDescriptor { - usage: TextureUsage::OUTPUT_ATTACHMENT, - format: TextureFormat::Bgra8UnormSrgb, - width: u32::from(width), - height: u32::from(height), - present_mode: wgpu::PresentMode::Vsync, - }, - ), - } - } - fn draw( &mut self, (primitive, mouse_cursor): &(Primitive, MouseCursor), @@ -363,17 +390,14 @@ impl iced_native::Renderer for Renderer { impl Windowed for Renderer { type Target = Target; - fn new(window: &W) -> Self { - Self::new(window) - } - - fn target(&self, width: u16, height: u16) -> Target { - self.target(width, height) + fn new() -> Self { + Self::new() } fn draw( &mut self, output: &Self::Output, + metrics: Option, target: &mut Target, ) -> MouseCursor { self.draw(output, target) -- cgit From ef056d84890e745010675e70f734f882f89356c2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 2 Nov 2019 20:20:35 +0100 Subject: Move `Target` to its own module --- wgpu/src/renderer.rs | 90 +++++++--------------------------------------------- 1 file changed, 12 insertions(+), 78 deletions(-) (limited to 'wgpu/src/renderer.rs') diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index 6e90c129..1988dfae 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -4,26 +4,19 @@ use iced_native::{ MouseCursor, Point, Rectangle, Widget, }; -use raw_window_handle::HasRawWindowHandle; use wgpu::{ Adapter, BackendBit, CommandEncoderDescriptor, Device, DeviceDescriptor, - Extensions, Limits, PowerPreference, Queue, RequestAdapterOptions, Surface, - SwapChain, SwapChainDescriptor, TextureFormat, TextureUsage, + Extensions, Limits, PowerPreference, Queue, RequestAdapterOptions, + TextureFormat, }; use wgpu_glyph::{GlyphBrush, GlyphBrushBuilder, Section}; use std::{cell::RefCell, rc::Rc}; -mod button; -mod checkbox; -mod column; -mod image; -mod radio; -mod row; -mod scrollable; -mod slider; -mod text; -mod text_input; +mod target; +mod widget; + +pub use target::Target; pub struct Renderer { device: Device, @@ -34,62 +27,6 @@ pub struct Renderer { glyph_brush: Rc>>, } -pub struct Target { - surface: Surface, - width: u16, - height: u16, - transformation: Transformation, - swap_chain: SwapChain, -} - -impl iced_native::renderer::Target for Target { - type Renderer = Renderer; - - fn new( - window: &W, - width: u16, - height: u16, - renderer: &Renderer, - ) -> Target { - let surface = Surface::create(window); - - let swap_chain = renderer.device.create_swap_chain( - &surface, - &SwapChainDescriptor { - usage: TextureUsage::OUTPUT_ATTACHMENT, - format: TextureFormat::Bgra8UnormSrgb, - width: u32::from(width), - height: u32::from(height), - present_mode: wgpu::PresentMode::Vsync, - }, - ); - - 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 = renderer.device.create_swap_chain( - &self.surface, - &SwapChainDescriptor { - usage: TextureUsage::OUTPUT_ATTACHMENT, - format: TextureFormat::Bgra8UnormSrgb, - width: u32::from(width), - height: u32::from(height), - present_mode: wgpu::PresentMode::Vsync, - }, - ); - } -} - pub struct Layer<'a> { bounds: Rectangle, y_offset: u32, @@ -153,7 +90,9 @@ impl Renderer { ) -> MouseCursor { log::debug!("Drawing"); - let frame = target.swap_chain.get_next_texture(); + let (width, height) = target.dimensions(); + let transformation = target.transformation(); + let frame = target.next_frame(); let mut encoder = self .device @@ -181,8 +120,8 @@ impl Renderer { Rectangle { x: 0, y: 0, - width: u32::from(target.width), - height: u32::from(target.height), + width: u32::from(width), + height: u32::from(height), }, 0, )); @@ -190,12 +129,7 @@ impl Renderer { self.draw_primitive(primitive, &mut layers); for layer in layers { - self.flush( - target.transformation, - &layer, - &mut encoder, - &frame.view, - ); + self.flush(transformation, &layer, &mut encoder, &frame.view); } self.queue.submit(&[encoder.finish()]); -- cgit From 2c6bfdbc8c2262c3550fa16d4472e29d73077956 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 3 Nov 2019 04:39:11 +0100 Subject: Implement debug view and load system fonts --- wgpu/src/renderer.rs | 64 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 12 deletions(-) (limited to 'wgpu/src/renderer.rs') diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index 1988dfae..770430ad 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -1,6 +1,6 @@ -use crate::{quad, Image, Primitive, Quad, Transformation}; +use crate::{font, quad, Image, Primitive, Quad, Transformation}; use iced_native::{ - renderer::Debugger, renderer::Windowed, Background, Color, Layout, Metrics, + renderer::Debugger, renderer::Windowed, Background, Color, Layout, MouseCursor, Point, Rectangle, Widget, }; @@ -62,13 +62,16 @@ impl Renderer { limits: Limits { max_bind_groups: 2 }, }); - // TODO: Think about font loading strategy - // Loading system fonts with fallback may be a good idea - let font: &[u8] = - include_bytes!("../../examples/resources/Roboto-Regular.ttf"); + // TODO: Font customization + let font_source = font::Source::new(); + let sans_serif_font = font_source.load(&[font::Family::SansSerif]); + let mono_font = font_source.load(&[font::Family::Monospace]); - let glyph_brush = GlyphBrushBuilder::using_font_bytes(font) - .build(&mut device, TextureFormat::Bgra8UnormSrgb); + let glyph_brush = GlyphBrushBuilder::using_fonts_bytes(vec![ + sans_serif_font, + mono_font, + ]) + .build(&mut device, TextureFormat::Bgra8UnormSrgb); let quad_pipeline = quad::Pipeline::new(&mut device); let image_pipeline = crate::image::Pipeline::new(&mut device); @@ -83,9 +86,10 @@ impl Renderer { } } - fn draw( + fn draw>( &mut self, (primitive, mouse_cursor): &(Primitive, MouseCursor), + overlay: &[T], target: &mut Target, ) -> MouseCursor { log::debug!("Drawing"); @@ -127,6 +131,7 @@ impl Renderer { )); self.draw_primitive(primitive, &mut layers); + self.draw_overlay(overlay, &mut layers); for layer in layers { self.flush(transformation, &layer, &mut encoder, &frame.view); @@ -260,6 +265,41 @@ impl Renderer { } } + fn draw_overlay<'a, T: AsRef>( + &mut self, + lines: &'a [T], + layers: &mut Vec>, + ) { + let first = layers.first().unwrap(); + let mut overlay = Layer::new(first.bounds, 0); + + let font_id = + wgpu_glyph::FontId(self.glyph_brush.borrow().fonts().len() - 1); + let scale = wgpu_glyph::Scale { x: 20.0, y: 20.0 }; + + for (i, line) in lines.iter().enumerate() { + overlay.text.push(Section { + text: line.as_ref(), + screen_position: (11.0, 11.0 + 25.0 * i as f32), + color: [0.9, 0.9, 0.9, 1.0], + scale, + font_id, + ..Section::default() + }); + + overlay.text.push(Section { + text: line.as_ref(), + screen_position: (10.0, 10.0 + 25.0 * i as f32), + color: [0.0, 0.0, 0.0, 1.0], + scale, + font_id, + ..Section::default() + }); + } + + layers.push(overlay); + } + fn flush( &mut self, transformation: Transformation, @@ -328,13 +368,13 @@ impl Windowed for Renderer { Self::new() } - fn draw( + fn draw>( &mut self, output: &Self::Output, - metrics: Option, + overlay: &[T], target: &mut Target, ) -> MouseCursor { - self.draw(output, target) + self.draw(output, overlay, target) } } -- cgit From 40e9a2f6ae8a9d8576531c79fb57bc53fe5a0acf Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 5 Nov 2019 03:49:10 +0100 Subject: Use new `Layer` in `draw_overlay` --- wgpu/src/renderer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wgpu/src/renderer.rs') diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index f8b546b3..c167f2bf 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -274,7 +274,7 @@ impl Renderer { layers: &mut Vec>, ) { let first = layers.first().unwrap(); - let mut overlay = Layer::new(first.bounds, 0); + let mut overlay = Layer::new(first.bounds, Vector::new(0, 0)); let font_id = wgpu_glyph::FontId(self.glyph_brush.borrow().fonts().len() - 1); -- cgit From 0157121038987feb6c2ea3066a21ce25e689888e Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 5 Nov 2019 03:57:13 +0100 Subject: Improve default font loading --- wgpu/src/renderer.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'wgpu/src/renderer.rs') diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index c167f2bf..060f07a3 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -64,14 +64,17 @@ impl Renderer { // TODO: Font customization let font_source = font::Source::new(); - let sans_serif_font = font_source.load(&[font::Family::SansSerif]); - let mono_font = font_source.load(&[font::Family::Monospace]); - - let glyph_brush = GlyphBrushBuilder::using_fonts_bytes(vec![ - sans_serif_font, - mono_font, - ]) - .build(&mut device, TextureFormat::Bgra8UnormSrgb); + let default_font = font_source + .load(&[font::Family::SansSerif, font::Family::Serif]) + .expect("Find sans-serif or serif font"); + + let mono_font = font_source + .load(&[font::Family::Monospace]) + .expect("Find monospace font"); + + let glyph_brush = + GlyphBrushBuilder::using_fonts_bytes(vec![default_font, mono_font]) + .build(&mut device, TextureFormat::Bgra8UnormSrgb); let quad_pipeline = quad::Pipeline::new(&mut device); let image_pipeline = crate::image::Pipeline::new(&mut device); -- cgit