diff options
Diffstat (limited to 'src/renderer.rs')
| -rw-r--r-- | src/renderer.rs | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/src/renderer.rs b/src/renderer.rs index ef2b6db..a15015b 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,4 +1,4 @@ -use std::convert::TryInto; +use std::{convert::TryInto, num::NonZeroU32}; use crate::{instance::InstanceId, vertex::SQUARE, Instance, RenderWindowConfig, Vertex}; use pollster::FutureExt; @@ -38,9 +38,10 @@ pub enum NewRendererError { #[derive(Debug)] pub struct Renderer { surface: wgpu::Surface, + surface_config: wgpu::SurfaceConfiguration, + supported_present_modes: Box<[wgpu::PresentMode]>, device: wgpu::Device, queue: wgpu::Queue, - surface_config: wgpu::SurfaceConfiguration, render_pipeline: wgpu::RenderPipeline, square_vertex_buffer: wgpu::Buffer, square_vertices: u32, @@ -158,6 +159,7 @@ impl Renderer { .expect("there was no device with the selected features"); // configuration for the surface + let supported_present_modes = surface.get_supported_modes(&adapter).into_boxed_slice(); let surface_config = config.to_surface_configuration( &surface.get_supported_modes(&adapter), surface.get_supported_formats(&adapter)[0], @@ -182,9 +184,10 @@ impl Renderer { Ok(Self { surface, + surface_config, + supported_present_modes, device, queue, - surface_config, render_pipeline, square_vertex_buffer, square_vertices, @@ -193,6 +196,10 @@ impl Renderer { }) } + fn reconfigure(&mut self) { + self.surface.configure(&self.device, &self.surface_config); + } + /// Resize just the renderer. The window will remain unchanged fn resize_renderer(&mut self, size: PhysicalSize<u32>) { if size.width == 0 || size.height == 0 { @@ -202,7 +209,26 @@ impl Renderer { self.surface_config.height = size.height; self.surface_config.width = size.width; - self.surface.configure(&self.device, &self.surface_config); + self.reconfigure(); + } + + /// Set the physical window and renderer size + pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) { + let size = PhysicalSize::new(width.get(), height.get()); + self.window.set_inner_size(size); + self.resize_renderer(size); + } + + /// Set vsync on or off. See `[RenderWindowConfig::present_mode]` for more details. + pub fn set_vsync(&mut self, vsync: bool) { + self.surface_config.present_mode = + RenderWindowConfig::present_mode(vsync, &self.supported_present_modes); + self.reconfigure(); + } + + /// Set the window's title + pub fn set_title(&mut self, title: &str) { + self.window.set_title(title); } /// Add an instance to the renderer, and returns an `InstanceId` to the @@ -305,7 +331,7 @@ impl Renderer { Ok(_) => {} // reconfigure the surface if it's been lost Err(wgpu::SurfaceError::Lost) => { - self.resize_renderer(self.window.inner_size()); + self.reconfigure(); } // if we ran out of memory, then we'll die Err(wgpu::SurfaceError::OutOfMemory) => { |
