summaryrefslogtreecommitdiff
path: root/src/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.rs')
-rw-r--r--src/renderer.rs36
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) => {