summaryrefslogtreecommitdiffstats
path: root/wgpu
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-05-20 20:28:35 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-05-20 20:28:35 +0200
commita1a5fcfd46622d5b18d1716aa2adb4659835ccf3 (patch)
tree8c9c2468151ebcc517688edc6d0d4867c11c441c /wgpu
parent720e7756f2afe30706b6b1a7fbde86b9f15e1d8c (diff)
downloadiced-a1a5fcfd46622d5b18d1716aa2adb4659835ccf3.tar.gz
iced-a1a5fcfd46622d5b18d1716aa2adb4659835ccf3.tar.bz2
iced-a1a5fcfd46622d5b18d1716aa2adb4659835ccf3.zip
Refactor `Viewport` and `Compositor`
Diffstat (limited to 'wgpu')
-rw-r--r--wgpu/src/backend.rs26
-rw-r--r--wgpu/src/lib.rs2
-rw-r--r--wgpu/src/target.rs14
-rw-r--r--wgpu/src/triangle.rs3
-rw-r--r--wgpu/src/window.rs2
-rw-r--r--wgpu/src/window/compositor.rs33
-rw-r--r--wgpu/src/window/swap_chain.rs61
7 files changed, 35 insertions, 106 deletions
diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs
index 82e4c4b2..1e62cf07 100644
--- a/wgpu/src/backend.rs
+++ b/wgpu/src/backend.rs
@@ -1,11 +1,11 @@
use crate::quad;
use crate::text;
use crate::triangle;
-use crate::{Settings, Target, Transformation};
+use crate::{Settings, Transformation};
use iced_graphics::backend;
use iced_graphics::font;
use iced_graphics::layer::Layer;
-use iced_graphics::Primitive;
+use iced_graphics::{Primitive, Viewport};
use iced_native::mouse;
use iced_native::{Font, HorizontalAlignment, Size, VerticalAlignment};
@@ -62,19 +62,19 @@ impl Backend {
&mut self,
device: &wgpu::Device,
encoder: &mut wgpu::CommandEncoder,
- target: Target<'_>,
+ frame: &wgpu::TextureView,
+ viewport: &Viewport,
(primitive, mouse_interaction): &(Primitive, mouse::Interaction),
- scale_factor: f64,
overlay_text: &[T],
) -> mouse::Interaction {
log::debug!("Drawing");
- let (width, height) = target.viewport.dimensions();
- let scale_factor = scale_factor as f32;
- let transformation = target.viewport.transformation();
+ let target_size = viewport.physical_size();
+ let scale_factor = viewport.scale_factor() as f32;
+ let transformation = viewport.projection();
- let mut layers = Layer::generate(primitive, &target.viewport);
- layers.push(Layer::overlay(overlay_text, &target.viewport));
+ let mut layers = Layer::generate(primitive, viewport);
+ layers.push(Layer::overlay(overlay_text, viewport));
for layer in layers {
self.flush(
@@ -83,9 +83,9 @@ impl Backend {
transformation,
&layer,
encoder,
- target.texture,
- width,
- height,
+ &frame,
+ target_size.width,
+ target_size.height,
);
}
@@ -106,7 +106,7 @@ impl Backend {
target_width: u32,
target_height: u32,
) {
- let bounds = layer.bounds * scale_factor;
+ let bounds = (layer.bounds * scale_factor).round();
if !layer.quads.is_empty() {
self.quad_pipeline.draw(
diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs
index 74007eae..b0eee0a0 100644
--- a/wgpu/src/lib.rs
+++ b/wgpu/src/lib.rs
@@ -34,7 +34,6 @@ pub mod window;
mod backend;
mod quad;
-mod target;
mod text;
pub use iced_graphics::{Defaults, Primitive, Viewport};
@@ -42,7 +41,6 @@ pub use wgpu;
pub use backend::Backend;
pub use settings::Settings;
-pub use target::Target;
#[doc(no_inline)]
pub use widget::*;
diff --git a/wgpu/src/target.rs b/wgpu/src/target.rs
deleted file mode 100644
index 1e72c0c3..00000000
--- a/wgpu/src/target.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-use crate::Viewport;
-
-/// A rendering target.
-#[derive(Debug)]
-pub struct Target<'a> {
- /// The texture where graphics will be rendered.
- pub texture: &'a wgpu::TextureView,
-
- /// The viewport of the target.
- ///
- /// Most of the time, you will want this to match the dimensions of the
- /// texture.
- pub viewport: &'a Viewport,
-}
diff --git a/wgpu/src/triangle.rs b/wgpu/src/triangle.rs
index 31975005..dc58a52a 100644
--- a/wgpu/src/triangle.rs
+++ b/wgpu/src/triangle.rs
@@ -326,7 +326,8 @@ impl Pipeline {
for (i, (vertex_offset, index_offset, indices)) in
offsets.into_iter().enumerate()
{
- let clip_bounds = meshes[i].clip_bounds * scale_factor;
+ let clip_bounds =
+ (meshes[i].clip_bounds * scale_factor).round();
render_pass.set_scissor_rect(
clip_bounds.x,
diff --git a/wgpu/src/window.rs b/wgpu/src/window.rs
index 391d3e36..aac5fb9e 100644
--- a/wgpu/src/window.rs
+++ b/wgpu/src/window.rs
@@ -1,6 +1,4 @@
//! Display rendering results on windows.
mod compositor;
-mod swap_chain;
pub use compositor::Compositor;
-pub use swap_chain::SwapChain;
diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs
index 8950ffd4..7eba8924 100644
--- a/wgpu/src/window/compositor.rs
+++ b/wgpu/src/window/compositor.rs
@@ -1,5 +1,6 @@
-use crate::{window::SwapChain, Renderer, Settings, Target};
+use crate::{Renderer, Settings};
+use iced_graphics::Viewport;
use iced_native::{futures, mouse};
use raw_window_handle::HasRawWindowHandle;
@@ -11,11 +12,11 @@ pub struct Compositor {
format: wgpu::TextureFormat,
}
-impl iced_native::window::Compositor for Compositor {
+impl iced_graphics::window::Compositor for Compositor {
type Settings = Settings;
type Renderer = Renderer;
type Surface = wgpu::Surface;
- type SwapChain = SwapChain;
+ type SwapChain = wgpu::SwapChain;
fn new(settings: Self::Settings) -> Self {
let (device, queue) = futures::executor::block_on(async {
@@ -66,19 +67,28 @@ impl iced_native::window::Compositor for Compositor {
surface: &Self::Surface,
width: u32,
height: u32,
- ) -> SwapChain {
- SwapChain::new(&self.device, surface, self.format, width, height)
+ ) -> Self::SwapChain {
+ self.device.create_swap_chain(
+ surface,
+ &wgpu::SwapChainDescriptor {
+ usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT,
+ format: self.format,
+ width,
+ height,
+ present_mode: wgpu::PresentMode::Mailbox,
+ },
+ )
}
fn draw<T: AsRef<str>>(
&mut self,
renderer: &mut Self::Renderer,
- swap_chain: &mut SwapChain,
+ swap_chain: &mut Self::SwapChain,
+ viewport: &Viewport,
output: &<Self::Renderer as iced_native::Renderer>::Output,
- scale_factor: f64,
overlay: &[T],
) -> mouse::Interaction {
- let (frame, viewport) = swap_chain.next_frame().expect("Next frame");
+ let frame = swap_chain.get_next_texture().expect("Next frame");
let mut encoder = self.device.create_command_encoder(
&wgpu::CommandEncoderDescriptor { label: None },
@@ -103,12 +113,9 @@ impl iced_native::window::Compositor for Compositor {
let mouse_interaction = renderer.backend_mut().draw(
&mut self.device,
&mut encoder,
- Target {
- texture: &frame.view,
- viewport,
- },
+ &frame.view,
+ viewport,
output,
- scale_factor,
overlay,
);
diff --git a/wgpu/src/window/swap_chain.rs b/wgpu/src/window/swap_chain.rs
deleted file mode 100644
index 72e58a50..00000000
--- a/wgpu/src/window/swap_chain.rs
+++ /dev/null
@@ -1,61 +0,0 @@
-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 {
- /// Creates a new [`SwapChain`] for the given surface.
- ///
- /// [`SwapChain`]: struct.SwapChain.html
- pub fn new(
- device: &wgpu::Device,
- surface: &wgpu::Surface,
- format: wgpu::TextureFormat,
- width: u32,
- height: u32,
- ) -> SwapChain {
- SwapChain {
- raw: new_swap_chain(surface, format, width, height, device),
- viewport: Viewport::new(width, height),
- }
- }
-
- /// Returns the next frame of the [`SwapChain`] alongside its [`Viewport`].
- ///
- /// [`SwapChain`]: struct.SwapChain.html
- /// [`Viewport`]: ../struct.Viewport.html
- pub fn next_frame(
- &mut self,
- ) -> Result<(wgpu::SwapChainOutput, &Viewport), wgpu::TimeOut> {
- let viewport = &self.viewport;
-
- self.raw.get_next_texture().map(|output| (output, viewport))
- }
-}
-
-fn new_swap_chain(
- surface: &wgpu::Surface,
- format: wgpu::TextureFormat,
- width: u32,
- height: u32,
- device: &wgpu::Device,
-) -> wgpu::SwapChain {
- device.create_swap_chain(
- &surface,
- &wgpu::SwapChainDescriptor {
- usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT,
- format,
- width,
- height,
- present_mode: wgpu::PresentMode::Mailbox,
- },
- )
-}